如果在构造函数中引发异常会发生什么

时间:2011-04-28 09:13:40

标签: c++

  

可能重复:
  What happens to base class destructor if a derived class destructor throws an exception

如果我在派生类的构造函数中抛出异常,是否会调用析构函数来清理基类?

5 个答案:

答案 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)

实际上,在构造函数中抛出异常是检测对象构造失败的常用方法之一,只要它由调用者正确处理,因为没有构造函数的返回值。