动态对象析构函数中的异常

时间:2012-12-09 23:27:07

标签: c++ exception destructor language-lawyer dynamic-allocation

我遇到了这个边缘问题,我通常会用“don't do that”解雇,但我在标准中找不到满意的答案,如果有人能指出推理,我会很感激:

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

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上运行了一个小测试,似乎自动释放内存。 (将此与构造函数中的异常进行对比,在这种情况下,保证调用释放函数(如果存在)。)

1 个答案:

答案 0 :(得分:6)

标准说(5.3.5p7):

  

如果 delete-expression 的操作数值不是空指针值, delete-expression 将调用释放函数。否则,未指定是否将调用释放功能。 [注意:无论对象的析构函数或数组的某个元素是否引发异常,都会调用释放函数。 - 结束说明]

该说明回答了您的问题。