3

我遇到了这个我通常会用“不要那样做”来驳回的边缘问题,但我在标准中找不到令人满意的答案,如果有人能指出原因,我将不胜感激:

假设我有一个在析构函数中引发异常的类:

struct Foo { ~Foo() { throw std::runtime_error("Catch this!"); } };

如果我删除该类的动态分配实例,动态分配的内存会发生什么情况?

auto p = new Foo;

try { delete p; }
catch (std::exception const &) { }

是否调用了释放函数?为什么?我可以通过添加operator delete(p);catch块中使此代码正确吗?

我用 GCC 进行了一个小测试,它似乎不会自动释放内存。(将此与构造函数中的异常进行对比,在这种情况下,保证会调用释放函数(如果存在)。)

4

1 回答 1

6

标准说(5.3.5p7):

如果delete-expression的操作数的值不是空指针值,则delete-expression将调用释放函数。否则,未指定是否将调用释放函数。[注意:无论对象的析构函数还是数组的某些元素是否抛出异常,都会调用释放函数。——尾注]

笔记回答了你的问题。

于 2012-12-09T23:32:58.390 回答