我真的不敢相信我找不到明确的答案......
在使用new运算符初始化C++类构造函数抛出异常后,如何释放分配的内存.例如:
class Blah
{
public:
Blah()
{
throw "oops";
}
};
void main()
{
Blah* b = NULL;
try
{
b = new Blah();
}
catch (...)
{
// What now?
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试这个时,b在catch块中是NULL(这是有道理的).
在调试时,我注意到conrol在它到达构造函数之前进入了内存分配例程.
这在MSDN网站上似乎证实了这一点:
当new用于为C++类对象分配内存时,在分配内存后调用对象的构造函数.
因此,请记住,b永远不会分配局部变量(即在catch块中为NULL),如何删除分配的内存?
得到一个跨平台的答案也很好.即,C++规范说什么?
澄清:我不是在讨论类在c'tor中分配内存然后抛出的情况.我很欣赏在这种情况下,不会召唤人.我在谈论用于分配THE对象的内存(Blah在我的例子中).
我正在阅读关于SO的问题,在其中一个答案中,它被提到:
如果找不到明确的匹配解除分配函数,则传播异常不会导致释放对象的内存.
所以,如果我只是重载我的new运算符而不是delete运算符,那么是否delete会创建并调用任何默认运算符; 或者,我是否还必须delete明确地编写运算符.