我真的不敢相信我找不到明确的答案......
在使用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在我的例子中).
在下面的代码中,如果构造/销毁某些数组元素会发生什么?
X* x = new X[10]; // (1)
delete[] x; // (2)
Run Code Online (Sandbox Code Playgroud)
我知道可以防止内存泄漏,但另外:
Ad(1),先前构造的元素是否被破坏?如果是,如果析构函数抛出这种情况会发生什么?
广告(2),是否破坏了尚未被破坏的元素?如果是,如果析构函数再次抛出会发生什么?