相关疑难解决方法(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万
查看次数

C++:如果我重载new运算符,我是否也必须重载delete运算符?

我正在阅读关于SO的问题,在其中一个答案中,它被提到:

如果找不到明确的匹配解除分配函数,则传播异常不会导致释放对象的内存.

所以,如果我只是重载我的new运算符而不是delete运算符,那么是否delete会创建并调用任何默认运算符; 或者,我是否还必须delete明确地编写运算符.

c++ new-operator dynamic-memory-allocation delete-operator

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