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";
    }
};