C++ 智能指针和构造函数异常
我了解到,当构造函数生成一些异常时,智能指针非常有用 问题是,构造函数在生成异常之前获得了一些资源,但没有调用析构函数(并且资源永久繁忙) 但我不能正确地理解它。 我的代码:C++ 智能指针和构造函数异常,c++,memory-leaks,shared-ptr,smart-pointers,resource-leak,C++,Memory Leaks,Shared Ptr,Smart Pointers,Resource Leak,我了解到,当构造函数生成一些异常时,智能指针非常有用 问题是,构造函数在生成异常之前获得了一些资源,但没有调用析构函数(并且资源永久繁忙) 但我不能正确地理解它。 我的代码: #包括 #包括 类别再拥有者{ 公众: 再拥有者(){ 标准::cout 如何使用智能指针解决此资源泄漏 将资源包装在RAII容器中,并将容器存储为resOwner的成员。您不一定需要智能指针 struct resource { resource() { std::cout << "Ma
#包括
#包括
类别再拥有者{
公众:
再拥有者(){
标准::cout
如何使用智能指针解决此资源泄漏
将资源包装在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";
}
};
struct资源{
资源(){
std::cout您应该对资源使用智能指针,它们将帮助您避免资源泄漏。例如:
class resource {
public:
resource() {
std::cout << "resource allocated\n";
}
~resource() {
std::cout << "resource deallocated\n";
}
};
class resOwner {
std::shared_ptr<resource> res;
public:
resOwner() : res(new resource) {
std::cout << "Map some huge resources\n";
throw "hi";
// res will be destroyed even though exception happened
}
~resOwner() {
// nothing need to do here
}
};
类资源{
公众:
资源(){
std::cout在实际创建对象之前引发异常。由于没有创建对象,因此不会调用其析构函数
另一方面,如果构造函数内引发异常,则对于构造函数已完成执行的所有子对象,将调用析构函数。请尝试以下方法进行比较:
类资源
{
公众:
资源()
{
std::不必担心-如果c-tor抛出内存会被释放-没有智能指针的配合-查看resOwner
拥有的任何资源必须是某种智能指针唯一的\u ptr
或共享的\u ptr
等。否则,您将导致资源泄漏,因为您计划在析构函数中清除的任何资源都无法获得c值得指出的是,如果单个构造函数运行到完成(构造函数委托),委托构造函数抛出,那么将调用对象的析构函数。
class resource {
public:
resource() {
std::cout << "resource allocated\n";
}
~resource() {
std::cout << "resource deallocated\n";
}
};
class resOwner {
std::shared_ptr<resource> res;
public:
resOwner() : res(new resource) {
std::cout << "Map some huge resources\n";
throw "hi";
// res will be destroyed even though exception happened
}
~resOwner() {
// nothing need to do here
}
};
class Resource
{
public:
Resource()
{
std::cout << "constructing resource" << std::endl;
}
~Resource()
{
std::cout << "destroying resource" << std::endl;
}
};
class Owner
{
::std::unique_ptr <Resource> theResource;
public:
Owner()
: theResource(new Resource())
{
std::cout << "Map some huge resources\n";
throw "hi";
}
~Owner()
{
std::cout << "Free some huge resources\n";
}
};