为什么C++抛出错误后还能析构函数内的对象
为什么C++抛出异常后还能析构函数内的对象?
如题,C++在一个函数内抛出异常后,函数内构造出来的对象还是可以确保执行析构,这是怎么做到的
------解决思路----------------------
抛之前看看那些对象已经存在,把它们按逆序逐个析构了就行,析构过程中要是有异常了,直接 terminate
------解决思路----------------------
测试之后发现,抛出异常后,离开try之前,会自动调用析构函数, 之后才到catch中
如果异常是构造函数抛出的, 那么不会调用析构函数。
如题,C++在一个函数内抛出异常后,函数内构造出来的对象还是可以确保执行析构,这是怎么做到的
------解决思路----------------------
抛之前看看那些对象已经存在,把它们按逆序逐个析构了就行,析构过程中要是有异常了,直接 terminate
------解决思路----------------------
using namespace std;
class MyExcept
{
public:
explicit MyExcept(string err) : errmsg(err) {}
string getErrMsg() { return errmsg; }
private:
string errmsg;
};
class Demo
{
public:
void except_test()
{
throw MyExcept("Throw exception in member function");
}
Demo () {}
~Demo()
{
cout << "Will destructor be called? " << endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
try
{
Demo d;
d.except_test();
}
catch (MyExcept& e)
{
cout << e.getErrMsg() << endl;
}
return 0;
}
测试之后发现,抛出异常后,离开try之前,会自动调用析构函数, 之后才到catch中
如果异常是构造函数抛出的, 那么不会调用析构函数。