构造函数、析构函数抛出异常的问题

首先下说一下结论:

  1. 构造函数可以抛出异常
  2. 析构函数不能抛出,也不应该抛出异常。

 

构造函数为什么可以抛出异常?

用new创建对象时要经历两个操作:分配内存和调用构造函数。若是在new分配内存时出错,则会抛出bab_alloc异常;如在调用构造函数初始化时出错,new运算符会保证不出现内存泄漏:

 T *p = new T;

将被编译器转换成类似下面这个样子:

void allocate_and_construct()

{

    // 第一步,分配原始内存,若失败则抛出bad_alloc异常

    try

    {

        // 第二步,调用构造函数构造对象

        new (p)T;       // placement new: 只调用T的构造函数

    }

    catch(...)

    {

        delete p;     // 释放第一步分配的内存

        throw;          // 重抛异常,通知应用程序

    }

}

 

析构函数不能抛出异常理由

  1. 如果析构函数抛出异常,则异常点之后的程序不会执行,如果析构函数在异常点之后执行了某些必要的动作,比如释放某些资源,则这些动作不会执行,会造成资源泄露的问题。(正常情况下调用析构函数抛出异常导致资源泄露)
  2. 通常异常发生时,c++的机制会调用析构函数来释放资源,若此时析构函数本身也抛出异常,则前一个异常尚未处理,又有新的异常,会造成程序崩溃的问题。(在发生异常的情况下调用析构函数抛出异常,会导致程序崩溃)

 

解决方案:

  1. 如果某个操作可能会抛出异常,class提供一个普通函数(而非析构函数),来执行该操作 。目的是给客户一个处理错误的机会。
  2. 如果析构函数中异常非抛不可,就把可能发生的异常完全封装在析构函数内部,绝不让它抛出函数之外。

参考:http://www.cnblogs.com/hellogiser/p/constructor-destructor-exceptions.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值