zoukankan      html  css  js  c++  java
  • More Effective C++ 条款11 禁止异常流出destructor之外

    1. ”两种情况下destructor会被调用。第一种情况是当对象在正常情况下被销毁,也就是当它离开了它的生存空间或是被明确的删除;第二种情况是当对象被exception处理机制——也就是exception传播过程中的stack-unwinding(栈展开)机制——销毁。”

    2. 当destructor被调用时,可能(也可能不)有一个exception正在作用之中,但我们无法再destructor中区分这些状态(现在有了区分的办法。1995年7月 IOS/ANSI C++ 标准委员会加入一个新函数: uncaught_exception。如果某个exception正在作用中而尚未被捕捉的话,它会返回true)。当destructor抛出一个异常的时候而不会被destructor捕捉的时候,它会传播到destructor的调用端,如果这个destructor本身是因他某个exception而被调用的,terminate函数便会被调用,它默认调用abort函数终止程序。

    3. 对于2有一个解决办法可以防止destructor抛出的异常传出destructor之外,那就是将destructor函数体包在一个try块之中,而catch(...)语句什么也不做,示例代码如下:

    1 ~A(){
    2     try{
    3         ...
    4     }
    5     catch(...){}
    6 }
    7 //......代表中间的代码被省略,...代表C++的元运算符
    View Code

    4. 除了2所示原因,让exception传出destructor之外还有一个坏处:如果destructor抛出exception而没有在当地捕捉,那个destructor就是执行不全,也就是说它没有完成它应该完成的事情。

    5. 综上,有两个理由支持我们采取措施阻止exception传出destructor之外:第一,它可以避免terminate函数在exception传播过程中的栈展开(stacking-unwinding)机制中被调用;第二,它可以协助确保destructors完成其应该完成的所有事情。

  • 相关阅读:
    RSA算法
    Windows-caffe配置
    python 下 excel,csv 文件的读写
    python 网络通讯 服务器端代码demo,能够同时处理多个客户端的连接请求
    python 下串口数据的读取,解析,和保存-
    XML字符串和JAVA对象之间的转化
    MySQL的join on和 where 的执行顺序和区别,以及各种连接说明
    全国各行政区行政编码
    计数器+打卡+习惯+目标APP推荐
    安卓计数器类APP推荐
  • 原文地址:https://www.cnblogs.com/reasno/p/4603208.html
Copyright © 2011-2022 走看看