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