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

Ker*_* SB 3 c++ destructor exception language-lawyer dynamic-allocation

我遇到了这个边缘问题,我通常会忽略" 不要这样做 ",但我在标准中找不到满意的答案,如果有人能指出推理,我会很感激:

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

struct Foo { ~Foo() { throw std::runtime_error("Catch this!"); } };
Run Code Online (Sandbox Code Playgroud)

如果删除此类的动态分配实例,动态分配的内存会发生什么变化?

auto p = new Foo;

try { delete p; }
catch (std::exception const &) { }
Run Code Online (Sandbox Code Playgroud)

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

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

Ben*_*igt 6

标准说(5.3.5p7):

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

说明回答了你的问题.

  • @Kerrek:听起来像是圣经比例的危机! (2认同)