如果在构造函数中抛出异常,是否会自动删除为对象分配的内存?

Dav*_*ton 4 c++

假设有这样的代码:

class CFoo
{
public:
    CFoo()
    {
        iBar = new CBar();
    }
private:
    CBar* iBar;
};

....
CFoo* foo = new CFoo();
Run Code Online (Sandbox Code Playgroud)

执行上面的行时,将分配第一个内存来保存CFoo对象.但是如果新的CBar()行引发异常(由于内存不足),系统会自动解除分配先前分配给CFoo对象的内存吗?我认为它必须,但找不到任何明确的参考说明.如果没有,编码器将如何释放内存,因为它不会被分配给foo?

CB *_*ley 6

是的,CFoo在这种情况下,将释放为该对象分配的内存.

由于分配失败导致的异常导致CFoo构造函数无法成功完成,因此保证new-expression释放为该CFoo对象分配的内存.

该保证在ISO/IEC 14882:2003的5.3.4 [expr.new]/17中规定.

请注意,始终建议将动态分配的结果分配给智能指针以确保正确清理.例如,如果CFoo构造函数中还有其他代码并且引发了异常CBar,则构造函数中先前已成功分配的对象将被泄露.