我知道当构造函数失败时,已完成的成员对象将被销毁。没有内存泄漏。
我的问题是编译器是如何做到的?编译器如何知道构造成员的是什么?它有什么记录吗?在这种情况下,编译器是否真的会破坏一切?它如何保证这一点?
答案 0 :(得分:4)
编译器如何做到这一点取决于编译器。
但是,是的,你可以保证任何构造的对象都会被破坏(按照它们构造的相反顺序)。 §15.2/ 2:
部分构造或部分销毁的对象将为其所有完全构造的子对象执行析构函数,即对于构造函数已完成执行且析构函数尚未开始执行的子对象。如果自动数组元素的构造函数抛出异常,则只会破坏该数组的构造元素。如果在new-expression中分配了对象或数组,则调用匹配的释放函数(3.7.3.2,5.3.4,12.5)(如果有)以释放对象占用的存储空间。