为什么虚构函数不允许抛出异常

来源:互联网 发布:福顺达对讲机写频软件 编辑:程序博客网 时间:2024/05/01 21:20

第一个原因

Session::Session(){     //构造函数     logCreation(this);    startTransaction(); //启动数据传送}Session::~Session(){   //析构函数    logDestruction(this);    endTransaction();  //结束数据传送}
设想如果在析构函数的logDestruction函数中抛出异常,那么endTransaction就不会被调用,因为异常发生之后异常点(即logDestruction)之后的语句块不会被执行。因此会产生资源泄漏。

解决方法如下

Session::Session(){      //构造函数     logCreation(this);    startTransaction();  //启动数据传送}Session::~Session(){     //析构函数    try{        logDestruction(this);    }catch(...){      endTransaction();               //结束数据传送    }   }
第二个原因是主要原因

  当执行到某个语句块时假如产生了异常,那么在异常发生前已经构造好的对象将会被销毁,很明显是调用这些对象的析构函数进行销毁,假如这些析构函数又产生了异常,那么此时存在两个异常。系统无法处理这些异常,所以会调用terminate函数终止这个程序,这当然不是我们希望看到的,解决的方法就是让所有类的对象的析构函数不能抛出异常。

0 0