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

第一个原因

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值