可能重复:
What happens to base class destructor if a derived class destructor throws an exception
如果我在派生类的构造函数中抛出异常,是否会调用析构函数来清理基类?
答案 0 :(得分:11)
然后以相反的顺序调用基类的析构函数。
在此之前,任何已经初始化的成员的析构函数也将被调用。
但是,当前构造的派生类的析构函数不会被调用,因为该对象的这部分还没有真正构造过。
答案 1 :(得分:7)
是。例如,考虑:
#include <iostream>
class B
{
public:
B() { std::cout << "B()\n"; }
~B() { std::cout << "~B()\n"; }
};
class D : public B
{
public:
D() { std::cout << "D()\n"; throw 23; }
~D() { std::cout << "~D()\n"; }
};
int main()
try
{
D d;
return 0;
}
catch(...) {}
输出:
B()
D()
~B()
答案 2 :(得分:7)
http://www.parashift.com/c++-faq-lite/exceptions.html#faq-17.10
对象中的每个数据成员都应该清理它自己的混乱。
如果构造函数抛出异常,则对象的析构函数不会抛出异常 跑。如果你的对象已经做了一些必要的事情 撤消(例如分配一些内存,打开文件或锁定 信号量),这个“需要撤消的东西”必须是 由对象内的数据成员记住。
保证调用基本析构函数,但不能调用对象本身的析构函数。
答案 3 :(得分:1)
是。完成基础或成员子对象的构造后,如果抛出异常,将正确销毁该子对象。
答案 4 :(得分:1)
实际上,在构造函数中抛出异常是检测对象构造失败的常用方法之一,只要它由调用者正确处理,因为没有构造函数的返回值。