c语言中构造函数和析构函数抛出异常

本文探讨了C++中构造函数和析构函数是否可以抛出异常的问题,并详细解释了为什么析构函数不应抛出异常及其正确的处理方式。

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

C++中构造函数和析构函数可以抛出异常吗?
  • 都不行
  • 都可以
  • 只有构造函数可以
  • 只有析构函数可以

答案是C
         1.不建议在构造函数中抛出异常;
       2.构造函数抛出异常时,析构函数将不会被执行,需要手动的去释放内存

        1.析构函数不应该抛出异常;
       2.当析构函数中会有一些可能发生异常时,那么就必须要把这种可能发生的异常完全封装在析构函数内部,决不能让它抛出函数之外;
       3. 析构函数异常相对要复杂一些,存在一种冲突状态,程序将直接崩溃:异常的被称为“栈展开(stack unwinding)”【备注】的过程中时,从析构函数抛出异常,C++运行时系统会处于无法决断的境遇,因此C++语言担保,当处于这一点时,会调用 terminate()来杀死进程。因此,当处理另一个异常的过程中时,不要从析构函数抛出异常, 抛出异常时,其子对象将被逆序析构


析构函数不能抛出异常,处理析构函数异常的正确方式是将异常封装在析构函数内部,而不是抛出异常,如下代码所示。
1
2
3
4
5
6
7
8
~ClassName(){
    try{
        do_something();
    }
    catch{
        //...
    }
}
原因如下:C++异常处理模型有责任处理那些因为出现异常而失效的对象,处理方式是调用这些失效对象的析构函数,释放掉它们占用的资源。如果析构函数再抛出异常,则会陷入无尽递归嵌套之中,因此这是不被允许的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值