当构造函数抛出异常什么析构函数运行?(What destructors are run when t

2019-06-23 18:03发布

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

特别是,它使任何区别,如果异常是初始化列表或身体时?

此外,有什么关于继承和成员? 想必所有已完成的建设得到自毁。 如果只有一些成员构成,也只有那些得到破坏? 如果有多重继承,不要全部建成构造得到破坏? 难道虚拟继承改变什么?

Answer 1:

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

所有对象的析构函数在该范围完全建立。

这有什么区别,如果异常是初始化列表或身体时?

所有已完成的对象将被销毁。
如果构造函数不能完全称为对象从来没有建造,因此不能被破坏。

什么关于继承和成员? 想必所有已完成的建设得到自毁。 如果只有一些成员构成,也只有那些得到破坏? 如果有多重继承,不要全部建成构造得到破坏? 难道虚拟继承改变什么?

所有已完成的结构并得到破坏。 是的,只有完全创建的对象得到自毁。

良好的阅读:

构造函数失败的香草萨特

尤其是爱的一部分,他解释说:

从生物学角度看,观念发生了 - 构造开始 - ,但尽管尽了最大努力紧随其后的是流产 - 构造从来没有跑过项(萌发的)。

顺便说一句,这就是为什么如果构造没有成功析构函数永远不会被调用 - 没有什么破坏。 “现在还不能死,因为它永远不会住了。” 请注意,这使得短语“一个对象,其构造函数抛出异常”真是一个矛盾的说法。 这样的事情是不是前的对象甚至更少......它从未生活,从来没有,从来没有呼吸了第一。



Answer 2:

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

已经构造了所有对象完成运行。

特别是,它使任何区别,如果异常是初始化列表或身体时?

号是完全例外之前建造的所有成员都会有自己的析构函数运行。 建设和所有其他非构造成员期间抛出的成员将不会有他们的析构函数运行。 成员结构的顺序是明确界定,因此你确切地知道会发生给你知道异常抛出点。

此外,有什么关于继承和成员?

规则同样适用。

想必所有已完成的建设得到自毁。

如果只有一些成员构成,也只有那些得到破坏?

如果有多重继承,不要全部建成构造得到破坏?

难道虚拟继承改变什么?

没有。
但请注意:虚拟继承不影响构造函数的调用顺序。 如果你不熟悉的顺序是如何定义的,这可能是不直观的,直到你看到了确切的规则。



Answer 3:

在因为构造的左局部范围内创建的任何对象将被破坏。 运行时处理走回了堆栈,调用析构函数,直到它找到一个处理程序。

如果异常是从一个构造函数抛出的,完全的构造子对象的析构函数将被调用。 此外,如果构造函数是部分new表达,适当的位置删除,如果它存在操作员将被调用。



文章来源: What destructors are run when the constructor throws an exception?