假设有这样的代码:
class CFoo
{
public:
CFoo()
{
iBar = new CBar();
}
private:
CBar* iBar;
};
....
CFoo* foo = new CFoo();
Run Code Online (Sandbox Code Playgroud)
执行上面的行时,将分配第一个内存来保存CFoo对象.但是如果新的CBar()行引发异常(由于内存不足),系统会自动解除分配先前分配给CFoo对象的内存吗?我认为它必须,但找不到任何明确的参考说明.如果没有,编码器将如何释放内存,因为它不会被分配给foo?
是的,CFoo
在这种情况下,将释放为该对象分配的内存.
由于分配失败导致的异常导致CFoo
构造函数无法成功完成,因此保证new-expression释放为该CFoo
对象分配的内存.
该保证在ISO/IEC 14882:2003的5.3.4 [expr.new]/17中规定.
请注意,始终建议将动态分配的结果分配给智能指针以确保正确清理.例如,如果CFoo
构造函数中还有其他代码并且引发了异常CBar
,则构造函数中先前已成功分配的对象将被泄露.