This question already has answers here:
C++ : handle resources if constructors may throw exceptions (Reference to FAQ 17.4]
(4个答案)
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