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

Wil*_*mKF 74 c++ constructor destructor exception-handling

在C++中,如果构造函数抛出异常,那么运行什么析构函数?

特别是,如果异常是在初始化列表或正文中,它会有什么不同吗?

还有,继承和成员呢?据推测,所有完工的建筑都被破坏了.如果只建造了一些成员,那么只有那些被破坏吗?如果有多个继承,那么所有已完成的构造函数都会被破坏吗?虚拟继承会改变什么吗?

Alo*_*ave 69

如果构造函数抛出异常,那么运行什么析构函数?

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

如果异常是在初始化列表或正文中,它会有什么不同吗?

所有已完成的对象都将被破坏.
如果构造函数从未被完全调用,则对象从未构造,因此不能被破坏.

继承和成员呢?据推测,所有完工的建筑都被破坏了.如果只建造了一些成员,那么只有那些被破坏吗?如果有多个继承,那么所有已完成的构造函数都会被破坏吗?虚拟继承会改变什么吗?

所有已完成的结构都会被破坏.是的,只有完全创建的对象才会被破坏.

好读:

Herb Sutter的构造函数失败

特别是,喜欢他解释的部分:

从生物学角度来说,概念发生了 - 构造函数开始了 - 但是尽管做了最大的努力,然后是流产 - 构造函数从未运行到期限(ination).

顺便说一句,这就是为什么如果构造函数没有成功就永远不会调用析构函数 - 没有什么可以破坏的."它不会死,因为它永远不会存在." 请注意,这使得短语"构造函数抛出异常的对象"实际上是矛盾的.这样的事情甚至比一个前对象还要少......它从来没有生存过,从来没有,从未放过第一个.


Mar*_*ork 19

在C++中,如果构造函数抛出异常,那么运行什么析构函数?

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

特别是,如果异常是在初始化列表或正文中,它会有什么不同吗?

不可以.在例外之前完全构建的所有成员都将运行析构函数.在施工期间投掷的成员和所有其他非建造成员将不会运行他们的析构函数.成员构造的顺序是明确定义的,因此您知道如果知道异常抛出点会发生什么.

还有,继承和成员呢?

同样的规则适用.

据推测,所有完工的建筑都被破坏了.

如果只建造了一些成员,那么只有那些被破坏吗?

如果有多个继承,那么所有已完成的构造函数都会被破坏吗?

虚拟继承会改变什么吗?


但要注意:虚拟继承不影响构造函数的调用顺序.如果您不熟悉订单的定义方式,那么在您查找确切的规则之前,这可能不直观.


Jam*_*nze 5

由于构造函数而在局部范围内创建的任何对象都将被破坏。运行时处理返回堆栈,调用析构函数,直到找到处理程序。

如果异常是从构造函数抛出的,则所有完全构造的子对象的析构函数都将被调用。此外,如果构造函数是new表达式的一部分,则将调用适当的放置删除运算符(如果存在)。