zoukankan      html  css  js  c++  java
  • 条款八 别让异常逃离析构函数

    1.最好是不要让析构函数吐出异常,如果析构函数吐出异常而且程序没有结束,这会导致不明确的行为
    当异常抛出时,本身函数就结束,函数里的后续处理就不会执行,这要是发生在析构函数里,可能因为
    异常而导致后续的数据释放没有完成,造成内存泄露

    class Test
    {
    public:
      Test(){ p = new char[4]; }
      ~Test()
      { 
        throw("exception"); //退出析构函数
        delete p; //不会执行
      }
    private:
      char *p;
    };

    两种不是很好的解决方法
    (1) 结束整个程序:Test *p = new Test;
    try{ delete p; }
    catch(...)
    {
    abort(); //直接结束程序,程序结束后系统自动会收回所为程序分配的内存
    }
    (2) 吞掉异常,对异常不做处理Test *p = new Test;
    try{ delete p; }
    catch(...){}


    2."双保险",把可能发生异常的处理放到析构函数以外的函数,如果那个函数没有执行或者发送异常,则再到析构函数里处理
    其实这个方法也没有多少好处,但是提供一个管理类,使得用户有了选择,而且减少了在析构函数里吐异常的可能

    class Test_1
    {
      public:
         void close(){....} //可能发生异常的函数
    };
    
    class Test_2 //定义一个管理类
    {
      public:
        Test_2(){ isClose = false}
       void close()
         {
            t1.close(); //若发生异常,下面的语句不会被执行
            isClose = true;
         }    
    
         ~Test_2()
         {
            if(!isClose)
            {
               try{ t1.close(); } //这个类的close()没有被使用或者发送异常,所以在析构函数里调用t1.close()关闭
               catch(...){} //这里可以使用结束整个程序或者吞掉异常方法处理
            }
          }
    
    private:
       Test_1 t1;
       bool isClose;
    };
    
     
  • 相关阅读:
    WHU 1540 Fibonacci 递推
    CSU 1378 Shipura 简单模拟
    UVALive 6486 Skyscrapers 简单动态规划
    JAVA杂记
    JAVA的main方法
    Java中的System类
    认识理解Java中native方法(本地方法)
    JAVA导入支持类
    从UDP的”连接性”说起–告知你不为人知的UDP
    udp如何实现可靠性传输?
  • 原文地址:https://www.cnblogs.com/bizhu/p/2605831.html
Copyright © 2011-2022 走看看