zoukankan      html  css  js  c++  java
  • EC笔记,第二部分:8.别让异常逃离析构函数

    1.为何析构函数不应该抛出异常?
        有两种情况:
        1).假设析构函数中有众多语句,而第一条语句抛出异常(或者其他语句),那么抛出异常以后的语句就得不到执行。而通常我们在析构函数中写的是清理资源(或回收资源)的代码,那么部分资源就不会被回收,会造成内存泄漏或程序提前结束(abort的作用)。
        2).析构函数被调用的时间是在对象被销毁时,而我们很难知道(或者说没有刻意注意)对象何时被销毁,所以很难捕捉一个由析构函数抛出的异常(更别说处理了)。
    2.两个并不高明的解决方案
        1).在析构函数中捕捉异常,并终止程序
        2).在析构函数中捕获异常,并吞下异常
            这两种方式都解决了第二种情况(终止程序自然就不会再抛出),但是第一种情况仍然难以解决
    3.一个比较好的解决方案
        通过将析构函数的工作交给其他成员函数来转嫁异常,在成员函数中做异常处理,而析构函数只是做一个检查,看是否资源被成功清理,如果没有被成功清理,则再由析构函数清理(析构函数按照2的方式处理异常),并保证这些异常不会被传播。这样如果成员函数的清理工作成功执行,则一切OK,如果没有被成功执行,则回到原点,由析构函数处理异常。(双保险)

  • 相关阅读:
    CSS overflow 隐藏属性
    CSS visibility 隐藏属性
    多线程中的detach
    多线程中join的解释(转)
    lib 和 dll 的区别、生成以及使用详解:(包括变量,函数,类导出3种情形)(转)
    堆和栈的区别
    ZMQ相关
    不同类型的指针加减(就是向前或向后移动)[转]
    memset函数及其用法,C语言memset函数详解
    zmq中的router和dealer
  • 原文地址:https://www.cnblogs.com/SkyFireITDIY/p/4376078.html
Copyright © 2011-2022 走看看