在两种情况下会调用析构函数:正常情况下删除对象,即显式调用或者对象离开声明周期;异常传递的栈开解,由异常处理系统删除对象。
可见,调用析构函数时异常可能处于激活状态,但不能再析构函数内部做判断,因此__必须在写析构函数时保守的假设异常被激活。如果一个异常被激活的同时,析构函数也抛出异常,并导致程序控制权转移到析构函数外,C++将调用terminate
函数:立即终止程序的运行,甚至没有释放局部对象。__
例如一个析构函数:
Session::~Session()
{
Destruction();
}
如果~Session()
本身由异常抛出调用,同时Destruction()
抛出了新的异常,并被传递到析构函数的调用者时,程序将会被立即终止。为了避免程序立即终止,必须通过try-catch
禁止异常信息传递到析构函数外。
Session::~Session()
{
try
{
Destruction();
}
catch(...)
{}
}
catch
的没有处理代码,确保本身不会产生新的异常;其看起来好像什么也没干,但阻止了任何试图抛出到析构函数外的异常。
原文:https://www.cnblogs.com/sandersunkown/p/15174040.html