我已经阅读了几篇文章,以及可以从构造函数中抛出异常的地方。但是,我注意到,如果从构造函数中抛出异常,它不会调用基类或其数据成员的析构函数。考虑下面的例子:从构造函数中抛出异常在C++中
#include <iostream>
using namespace std;
struct C
{
C() { cout << __FUNCTION__ << endl; }
~C() { cout << __FUNCTION__ << endl; }
};
struct E: public C
{
C c;
E() { cout << __FUNCTION__ << endl; throw 4; }
~E() { cout << __FUNCTION__ << endl; }
};
int main()
{
E e;
}
$ g++ test.cpp; ./a.exe
C
C
E
terminate called after throwing an instance of 'int'
Aborted (core dumped)
在这种情况下,E的构造函数抛出异常但是C的析构函数作为数据成员或作为基类不被调用。现在,如果C的析构函数像关闭文件/套接字和删除堆分配一样执行一些清理操作,这可能会导致问题。
所以我的问题是为什么和什么时候可以从构造函数中抛出异常。
请注意,如果您在'main'中捕获到异常,则会调用析构函数。见[这里](http://ideone.com/nQemT)。 – 2012-03-10 01:54:59
在您习惯使用异常之前,您可能需要阅读[this](http://stackoverflow.com/questions/1744070/why-should-exceptions-be-used-conservatively)及其相关问题。 – Shahbaz 2012-03-10 02:15:27