c++ - 当我抛出异常时内存是否被释放?

标签 c++ exception constructor 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;
    }
}

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

干杯!
丰富

最佳答案

调用

new B();

解决两件事:

  • 使用运算符 new() 进行分配(全局运算符或类特定运算符,可能是语法为 new (xxx) B() 的放置运算符)
  • 调用构造函数。

如果构造函数抛出异常,则调用相应的运算符 delete。对应的删除是放置删除的情况是唯一没有使用语法::operator delete() 调用放置删除运算符的情况。 delete x;delete[] x; 不要调用 placement delete 运算符,并且没有与 placement new 类似的语法来调用它们。

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

关于c++ - 当我抛出异常时内存是否被释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1306094/

相关文章:

c++ - 实现 OpenSceneGraph 时在 Qt 中获取引用问题

c++ - 为什么在尝试实现 OpenMPI 时设置单元数

c++ - 依赖于模板参数的成员函数实现

python - 尝试自动化浏览器时 Selenium 中的 ElementNotInteractableException

java - 可以将异常存储在变量中以便稍后抛出吗?

c++ - 为什么按值传递 QStringView 比引用常量更快?

c# - 捕获已处理的异常

c++ - 构造函数 : init() method, 指针中的异常,大型 try/catch 或..?

c# - 如何确保在不调用任何成员的情况下调用静态构造函数

c++ - 编译器如何选择自动类型转换方法