禁止异常流出destructor之外

两种情况下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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值