抛出异常时是否释放内存?

Ric*_*ich 7 c++ constructor exception handler

我正在与一些同事讨论在动态分配的类中抛出异常时会发生什么.我知道malloc被调用,然后是类的构造函数.构造函数永远不会返回,所以会发生什么malloc

请考虑以下示例:

class B
{
public:
    B()
    {
        cout << "B::B()" << endl;
        throw "B::exception";
    }

    ~B()
    {
        cout << "B::~B()" << endl;          
    }
};

void main()
{
    B *o = 0;
    try
    {
        o = new B;
    }
    catch(const char *)
    {
        cout << "ouch!" << endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

malloced内存会发生什么o,它会泄漏吗?CRT是否捕获构造函数的异常并释放内存?

干杯!
丰富

APr*_*mer 10

打电话给

new B();
Run Code Online (Sandbox Code Playgroud)

解决了两件事:

  • 使用运算符new()分配(全局一个或类特定的一个,可能是一个带有语法的放置new (xxx) B())
  • 调用构造函数.

如果构造函数抛出,则调用相应的运算符delete.相应删除是放置的情况是唯一一种在没有语法:: operator delete()的情况下调用放置删除操作符的情况. delete x;或者delete[] x;不要调用放置删除操作符,并且没有类似于放置new的语法来调用它们.

请注意,虽然不会调用B的析构函数,但在调用operator delete之前,已经构造的子对象(B的成员或B和基类)将被销毁.未调用的构造函数是B的构造函数.


Căt*_*tiș 6

当从构造函数抛出异常时,释放new分配的内存,但不调用类B的析构函数.

  • 是.只是为了补充你的答案......没有被调用析构函数的理由很充分:从未创建过对象.只针对特定时间段内存在的对象调用析构函数.这些是构造函数成功完成的情况. (3认同)
  • 你是对的.只有在构造函数成功执行后,才会考虑创建一个对象(因此可以破坏). (2认同)