构造函数中可不可以抛出异常?析构函数呢?

在C++中,构造函数抛出异常是安全的,因为new运算符的实现确保了内存不会泄漏。然而,析构函数抛出异常是不推荐的,因为这可能导致在异常处理期间调用析构函数时程序终止。如果必须从析构函数抛出异常,应先检查当前是否有未处理的异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

构造函数中可不可以抛出异常?析构函数呢?

 

首先,从语法上来说,二者都是没有问题的。但没有语法问题不表明不存在逻辑问题

引用http://hi.youkuaiyun.com/zhangyanli的帖子:


构造函数:
无论何时,从构造函数中抛出异常都是安全的。镜头创建的对象没有什么问题,关键是动态创建对象的异常处理。动态创建对象要进行两个操作,分配内存,调用构造函数初始化。若分配内存失败,则会抛出bad_alloc异常,是安全的。若内存分配成功,但是在调用构造函数时抛出了异常,会不会造成内存泄漏呢?

new运算符的实现保证了内存泄漏不会发生。例如

T *p = new T;

 

将被编译器转换给类似下面的样子:

 

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

try {

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

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

}

catch(...) {

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

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

}

 

析构函数:
C++并没有禁止析构函数引发异常,但是C++不推荐这一做法,从析构函数中抛出异常是及其危险的。

析构函数可能在对象正常结束生命周期时调用,也可能在有异常发生时从函数堆栈清理时调用。前一种情况抛出异常不会有无法预料的结果,可以正常捕获;但后一种情况下,因为函数发生了异常而导致函数的局部变量的析构函数被调用,析构函数又抛出异常,本来局部对象抛出的异常应该是由它所在的函数负责捕获的,现在函数既然已经发生了异常,必定不能捕获,因此,异常处理机制只能调用terminate()。若真的不得不从析构函数抛出异常,应该首先检查当前是否有仍未处理的异常,若没有,才可以正常抛出。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值