如果在构造函数中发生异常,如何释放动态内存

How to free dynamic memory if exception occurs in constructor?

本文关键字:何释放 释放 内存 动态 构造函数 异常 如果      更新时间:2023-10-16

i遇到了一种构造函数分配动态内存的情况,如果构造函数中发生任何例外,则没有释放动态分配的内存。为了避免这种情况,我使用了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:删除了被错误留下的删除器中的评论代码

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

还要注意,在任何情况下,您的delete a在任何情况下都是错误的,因为unique_ptr不是指针本身。相关的是,如果构造函数中有例外,则也不会调用破坏者。