This question already has answers here:
C++ : handle resources if constructors may throw exceptions (Reference to FAQ 17.4]

(4个答案)


4年前关闭。




我读到智能指针在构造函数生成某些异常的情况下很有用。

问题在于,构造函数在异常生成之前获得了一些资源,但是没有调用析构函数(并且资源永久繁忙)。

但是我不能正确理解它。
我的代码:
#include <memory>
#include <iostream>

class resOwner {
    public:
    resOwner() {
        std::cout << "Map some huge resources\n";
        throw "hi";
    }

    ~resOwner() {
        std::cout << "Free some huge resources\n";
    }
};

class normal : resOwner {
};

int main (){
    try {
        std::shared_ptr<resOwner> k (new resOwner());
    } catch (...) {}
}

输出为Map some huge resources
如何使用智能指针解决此资源泄漏?

最佳答案



将资源包装在RAII容器中,并将该容器存储为resOwner的成员。您不一定需要智能指针。

struct resource {
    resource() {
        std::cout << "Map some huge resources\n";
    }
    ~resource() {
        std::cout << "Free some huge resources\n";
    }
};

struct resOwner {
    resource res;
    resOwner() {
        throw "hi";
    }
};

如果该巨大资源是动态分配的对象,那么您无需实现单独的resource类,因为标准库已经具有用于这些对象的容器:std::unique_ptr。如果它是动态分配的数组,则可以使用std::vector

工作方式:当构造函数主体或子对象构造函数之一抛出时,所有已构造的子对象(成员和基础对象)将被破坏。这保证了~resource将被调用。

09-07 06:27