构造函数抛出exception时运行哪些析构函数?

在C ++中,如果构造函数抛出一个exception,什么析构函数运行?

特别是,如果在初始化列表或主体期间发生exception,它会有什么区别吗?

另外,inheritance和成员呢? 大概所有完成的build筑被破坏。 如果只有一些成员构build,只有那些被破坏? 如果有多重inheritance,那么所有完成的构造函数是否被破坏? 虚拟inheritance是否改变了什么?

如果构造函数抛出一个exception,什么析构函数运行?

所有完全在该范围内创build的对象的析构函数。

如果exception是在初始化列表或主体中,是否有区别?

所有完成的对象将被破坏。
如果构造函数从来没有被完全调用,那么对象从来没有构build过,因此不能被破坏。

inheritance和成员呢? 大概所有完成的build筑被破坏。 如果只有一些成员构build,只有那些被破坏? 如果有多重inheritance,那么所有完成的构造函数是否被破坏? 虚拟inheritance是否改变了什么?

所有完成的build筑物都遭到破坏。 是的,只有完全创build的对象被破坏。

好阅读:

由香草萨特构造失败

特别是,爱他解释的部分:

从生物学的angular度来说,概念发生了 – build造者开始了 – 但尽pipe最大的努力之后是stream产 – build设者从来没有跑到术语(ination)。

顺便说一句,这就是为什么如果构造函数没有成功,析构函数将永远不会被调用 – 没有什么可以销毁的。 “它不能死,因为它永远不会死。” 请注意,这使得短语“构造函数抛出exception的对象”真是一个矛盾。 这样的事情甚至不如前者…它从来没有活过,从来没有,从来没有呼吸过它的第一个。

在C ++中,如果构造函数抛出一个exception,什么析构函数运行?

所有具有构造函数的对象都运行完成。

特别是,如果在初始化列表或主体期间发生exception,它会有什么区别吗?

不是。在exception之前完全构build的所有成员都将运行它们的析构函数。 在施工期间投掷的成员和所有其他非构造成员不会有他们的破坏者运行。 会员build设的顺序是明确的,因此你知道到底发生了什么事情,因为你知道exception投掷点。

另外,inheritance和成员呢?

同样的规则适用。

大概所有完成的build筑被破坏。

如果只有一些成员构build,只有那些被破坏?

如果有多重inheritance,那么所有完成的构造函数是否被破坏?

虚拟inheritance是否改变了什么?

没有。
但是请注意:虚拟inheritance确实会影响构造函数的调用顺序。 如果您对定单的定义不熟悉,则可能是非直观的,直到查找确切的规则。

由于构造函数而在本地范围内创build的任何对象都将被销毁。 运行时处理回溯堆栈,调用析构函数,直到find处理程序。

如果从构造函数中抛出exception,则将调用所有完全构造的子对象的析构函数。 另外,如果构造函数是newexpression式的一部分,那么将会调用相应的位置删除操作符(如果存在)。