我遇到了这个边缘问题,我通常会用“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上运行了一个小测试,似乎不自动释放内存。 (将此与构造函数中的异常进行对比,在这种情况下,保证调用释放函数(如果存在)。)
答案 0 :(得分:6)
标准说(5.3.5p7):
如果 delete-expression 的操作数值不是空指针值, delete-expression 将调用释放函数。否则,未指定是否将调用释放功能。 [注意:无论对象的析构函数或数组的某个元素是否引发异常,都会调用释放函数。 - 结束说明]
该说明回答了您的问题。