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

C++ 如果在构造函数中引发异常,会发生什么,c++,C++,可能重复: 如果我在派生类的构造函数中抛出异常,是否调用析构函数来清理基类?然后按相反顺序调用基类的析构函数 在此之前,任何已初始化成员的析构函数也将被调用 但是,当前构造的派生类的析构函数不会被调用,因为对象的这一部分还没有真正构造。是。一旦基本或成员子对象的构造完成,如果抛出异常,该子对象将被正确销毁。是。例如,考虑: #include <iostream> class B { public: B() { std::cout << "B()\n"; }

可能重复:


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

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

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


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

是。一旦基本或成员子对象的构造完成,如果抛出异常,该子对象将被正确销毁。

是。例如,考虑:

#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()