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