gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:09:56 26 4
gpt4 key购买 nike

我曾与一些同事讨论当您在动态分配的类中抛出异常时会发生什么。我知道 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com