两种情况下destructor会被调用:
1、当对象在正常状态下被销毁,也就是当它离开了它的生存空间或被明确地删除;
2、当对象被exception处理机制--也就是exception传播过程中的stack-unwinding(栈展开)机制--销毁;
/*如果控制权基于exception的因素离开destructor,而此时正有另一个exception处于作用状态,C++会自动调用terminate函数。它会
将你的程序结束掉,甚至不等局部对象被销毁*/
举个例子:
考虑一个用来监视在线计算的活动--也就是从你登录开始直到退出为止的所有行为的session class。每个session object都会记录其构造
和析构的日期和时间。
class Session
{
public:
Session();
~Session();
private:
static void logCreation( Session* objAddr );
static void logDestruction( Session* objAddr );
};
Session::~Session()
{
logDestruction( this );
}
如果logDestruction抛出一个异常,这个异常并不会被Session Destructor捕捉,所以它会传播到destructor的调用端。但是万一这个destructor本身是因其他某个
异常被调用的,terminate函数会被自动调用。
修改:
Session::~Session()
{
try{ logDestructor(this);}catch(...){}
}
这个语句块阻止了logDestructor所抛出的exception传出Session Destructor之外。
阻止异常传出destructor之外的两个好处:
1、它可以避免terminate函数在异常传播过程的栈展开机制中被调用;
2、它可以协助确保destructors完成其应该完成的所有事情。
More Effective C++ ----11th