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

use*_*rbb 21 c++

可能重复:
如果派生类析构函数抛出异常,基类析构函数会发生什么

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

ere*_*eOn 11

然后以相反的顺序调用基类的析构函数.

在此之前,任何已经初始化的成员的析构函数也将被调用.

但是,当前构造的派生类的析构函数不会被调用,因为该对象的这部分还没有真正构造.


Stu*_*etz 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(...) {}
Run Code Online (Sandbox Code Playgroud)

输出:

B()
D()
~B()
Run Code Online (Sandbox Code Playgroud)


log*_*og0 7

http://www.parashift.com/c++-faq-lite/exceptions.html#faq-17.10

对象中的每个数据成员都应该清理自己的混乱.

如果构造函数抛出异常,则不会运行该对象的析构函数.如果您的对象已经完成了需要撤消的操作(例如分配一些内存,打开文件或锁定信号量),则必须通过对象内的数据成员记住这些"需要撤消的内容".

保证可以调用基本析构函数,但不能调用对象本身的析构函数.