首页 > 解决方案 > 如果构造函数中发生异常,如何释放动态内存?

问题描述

我遇到了构造函数分配动态内存的情况,如果构造函数中发生任何异常,它并没有释放动态分配的内存。为了避免这种情况,我使用了 unique_ptr,它能够正确释放内存。

为了展示这里的情况,这是一个虚拟代码。

class ExceptionInConstructor
{
 unique_ptr<int> a;
public:
    ExceptionInConstructor()
    {
        a = std::unique_ptr<int>( new int(10));
        cout <<"Constructor called. Value of a is "<< *a<<endl;
        //some exception occurs after the mrmory allocation
        throw exception();
    }
    ~ExceptionInConstructor()
    {
        cout << "Dest called()"<<endl;
    }
};

int main()
{ 
    try
    {       
        ExceptionInConstructor ex; 
    }
    catch(...)
    {}  
    return 0;
 }

对于这种情况,这是一种正确有效的方法,还是对于这种情况有更好的选择?

编辑1:删除了错误留下的析构函数中的注释代码

标签: c++

解决方案


不,这正是智能指针和一般RAII的重点和预期用例。

另请注意,您delete a的析构函数在任何情况下都是错误的,因为unique_ptr它本身不是指针。相关地,如果构造函数中存在异常,也不会调用析构函数。


推荐阅读