构造函数抛出异常时运行哪些析构函数? C++中,如果构造函数抛出异常,运行什么析构函数?< /P>

构造函数抛出异常时运行哪些析构函数? C++中,如果构造函数抛出异常,运行什么析构函数?< /P>,c++,constructor,exception-handling,destructor,C++,Constructor,Exception Handling,Destructor,特别是,如果异常发生在初始化列表或主体期间,是否会有任何区别 还有,继承和成员呢?大概所有完工的建筑都被破坏了。如果只构造了一些成员,那么只有那些成员会被破坏吗?如果存在多重继承,是否所有已完成的构造函数都会被破坏?虚拟继承会改变什么吗?如果构造函数引发异常,将运行哪些析构函数? 在该范围内完全创建的所有对象的析构函数 如果在初始化列表或正文期间出现异常,会有什么区别吗? 所有完成的对象都将被销毁。 若构造函数从未被完全调用,那个么对象从未被构造过,所以不能被销毁 那么继承和成员呢?大概所有完工

特别是,如果异常发生在初始化列表或主体期间,是否会有任何区别


还有,继承和成员呢?大概所有完工的建筑都被破坏了。如果只构造了一些成员,那么只有那些成员会被破坏吗?如果存在多重继承,是否所有已完成的构造函数都会被破坏?虚拟继承会改变什么吗?

如果构造函数引发异常,将运行哪些析构函数?

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

如果在初始化列表或正文期间出现异常,会有什么区别吗?

所有完成的对象都将被销毁。
若构造函数从未被完全调用,那个么对象从未被构造过,所以不能被销毁

那么继承和成员呢?大概所有完工的建筑都被破坏了。如果只构造了一些成员,那么只有那些成员会被破坏吗?如果存在多重继承,是否所有已完成的构造函数都会被破坏?虚拟继承会改变什么吗?

所有完工的建筑都会被破坏。是的,只有完全创建的对象才会被销毁

好书:

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

从生物学的角度讲,受孕发生了——构造器开始了——但尽管尽了最大的努力,之后还是流产了——构造器从来没有成功过

顺便说一句,这就是为什么如果构造函数没有成功,就永远不会调用析构函数——没有什么可以销毁的。“它不会死,因为它从来没有活过。”请注意,这使得短语“其构造函数引发异常的对象”实际上是一个矛盾修饰法。这样的东西甚至比以前的东西还少。。。它从来没有活过,从来没有,从来没有第一次呼吸过


由于构造函数而在本地作用域中创建的任何对象都将 被摧毁。运行时处理返回堆栈,调用 析构函数,直到找到处理程序

如果从构造函数引发异常,则所有 将调用完全构造的子对象。此外,如果 构造函数是
新表达式的一部分,即适当的位置
如果存在删除运算符,将调用该运算符

C++中,如果构造函数抛出异常,运行什么析构函数?< /P> 所有具有构造函数的对象都运行到完成

特别是,如果异常发生在初始化列表或主体期间,是否会有任何区别

否。在异常之前完全构造的所有成员都将运行其析构函数。在构造期间抛出的成员和所有其他未构造成员将运行其析构函数。成员构造的顺序定义得很好,因此只要知道异常抛出的点,就可以确切地知道将发生什么

还有,继承和成员呢

同样的规则也适用

大概所有完工的建筑都被破坏了

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

如果存在多重继承,是否所有已完成的构造函数都会被破坏

虚拟继承会改变什么吗

否。

但是请注意:虚拟继承确实会影响构造函数的调用顺序。如果您不熟悉顺序的定义,在查找确切的规则之前,这可能是不直观的。

究竟什么是“逻辑范围”?你可能还想阅读关于大致相同主题的@Als。有一条警告:……你没有亲自测试这一点有什么原因吗?@Steve:因为如果你想要可移植或可维护的代码,依赖某个特定编译器版本的行为是一个可怕的想法。@BenVoigt-我在理论上同意。但是当你在现实世界中编码时,你必须面对现实。如果所有主要的编译器都没有做到这一点,我会非常惊讶。+1用于描述新的'd表达式会发生什么。这很重要。