相关疑难解决方法(0)

谁删除了在构造函数中有异常的"新"操作期间分配的内存?

我真的不敢相信我找不到明确的答案......

在使用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在我的例子中).

c++ constructor memory-leaks exception

49
推荐指数
4
解决办法
1万
查看次数

new []/delete []并在C++中抛出构造函数/析构函数

在下面的代码中,如果构造/销毁某些数组元素会发生什么?

X* x = new X[10]; // (1)
delete[] x;       // (2)
Run Code Online (Sandbox Code Playgroud)

我知道可以防止内存泄漏,但另外:

  1. Ad(1),先前构造的元素是否被破坏?如果是,如果析构函数抛出这种情况会发生什么?

  2. 广告(2),是否破坏了尚未被破坏的元素?如果是,如果析构函数再次抛出会发生什么?

c++ arrays exception new-operator delete-operator

1
推荐指数
1
解决办法
620
查看次数