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运行了一个小测试,似乎没有自动释放内存.(将此与构造函数中的异常进行对比,在这种情况下,保证调用释放函数(如果存在).)
标准说(5.3.5p7):
如果delete-expression的操作数的值不是空指针值,则delete-expression将调用deallocation函数.否则,未指定是否将调用释放功能.[注意:无论对象的析构函数或数组的某个元素是否引发异常,都会调用释放函数. - 结束说明]
说明回答了你的问题.
| 归档时间: |
|
| 查看次数: |
202 次 |
| 最近记录: |