我正在与一些同事争论当你在动态分配的类中抛出异常时会发生什么。我知道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 是否捕获构造函数的异常并释放内存?
Cheers!
Rich
致电
new B();
解决两件事:
- 使用运算符 new() 进行分配(全局运算符或特定于类的运算符,可能是具有以下语法的放置运算符
new (xxx) B()
)
- 调用构造函数。
如果构造函数抛出异常,则调用相应的删除操作符。相应的删除是放置删除的情况是调用放置删除运算符而不使用语法 ::operator delete() 的唯一情况。delete x;
or delete[] x;
不要调用布局删除运算符,并且没有与布局新类似的语法来调用它们。
请注意,虽然 B 的析构函数将not被调用时,已经构造的子对象(成员或 B 和 B 的基类)将在调用运算符删除之前被破坏。未调用的构造函数是 B 的构造函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)