c++ 当构造函数抛出异常时,运行什么析构函数?

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

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

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

最佳答案
如果一个构造函数抛出一个异常,什么析构函数运行?

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

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

所有完成的对象将被销毁。
如果构造函数从未被完全调用,对象从未被构造,因此不能被破坏。

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

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

好读:

Constructor Failures by Herb Sutter

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

In biological terms, conception took place — the constructor began –, but despite best efforts it was followed by a miscarriage — the constructor never ran to term(ination).

Incidentally, this is why a destructor will never be called if the constructor didn’t succeed — there’s nothing to destroy. “It cannot die, for it never lived.” Note that this makes the phrase “an object whose constructor threw an exception” really an oxymoron. Such a thing is even less than an ex-object… it never lived, never was, never breathed its first.

转载注明原文:c++ 当构造函数抛出异常时,运行什么析构函数? - 代码日志