2010-03-03 26 views
1

我知道当构造函数失败时,已完成的成员对象将被销毁。没有内存泄漏。构造函数如何失败以销毁完成的对象?

我的问题是,编译器如何做到这一点?编译器如何知道构件是什么构件?它是否记录了它?在这种情况下,编译器是否真的销毁了一切?它如何保证这一点?

+1

请参阅http://stackoverflow.com/questions/188693/is-the-destructor-called-if-the-constructor-throws-an-exception。 –

+0

与清理函数局部变量(包括早期返回和异常情况)真的有很大区别吗?你为什么需要知道? – UncleBens

回答

4

编译器如何做到这一点取决于编译器。

但是,您可以保证任何构造的对象都会被破坏(按照它们构造的相反顺序)。 §15.2/ 2:

被部分构造或部分被毁将对所有其完全构造子对象执行时,即析构函数,对于子对象的量,构造已经完成执行和析构函数还没有一个目的开始执行。如果自动数组元素的构造函数抛出异常,那么只有该数组的构造元素将被销毁。如果对象或数组是用新表达式分配的,则会调用匹配的释放函数(3.7.3.2,5.3.4,12.5)(如果有),以释放该对象占用的存储空间。