当前位置: 首页 > news >正文

析构函数中不应该抛出异常(摘录)

析构函数中抛出异常时概括性总结
从语法上面讲,析构函数抛出异常是可以的,C++并没有禁止析构函数引发异常,但是C++不推荐这一做法,从析构函数中抛出异常是及其危险的。

  1. 如果析构函数抛出异常,则异常点之后的程序不会执行,如果析构函数在异常点之后执行了某些必要的动作比如释放某些资源,则这些动作不会执行,会造成诸如资源泄漏的问题。

  2. 通常异常发生时,c++的机制会调用已经构造对象的析构函数来释放资源,此时若析构函数本身也抛出异常,则前一个异常尚未处理,又有新的异常,会造成程序崩溃的问题。

(1) C++中析构函数的执行不应该抛出异常;

(2) 假如析构函数中抛出了异常,那么你的系统将变得非常危险,也许很长时间什么错误也不会发生;但也许你的系统有时就会莫名奇妙地崩溃而退出了,而且什么迹象也没有,崩得你满地找牙也很难发现问题究竟出现在什么地方;

(3) 当在某一个析构函数中会有一些可能(哪怕是一点点可能)发生异常时,那么就必须要把这种可能发生的异常完全封装在析构函数内部,决不能让它抛出函数之外

  • 在 C++ 中,对象的析构函数(Destructor)负责清理对象所分配的资源,包括释放内存、关闭文件、释放锁等。当发生异常或者对象生命周期结束时,C++ 的机制会自动调用已构造对象的析构函数来释放资源,确保资源的正确释放,避免内存泄漏和资源泄漏问题的发生。

  • C++ 使用 RAII(Resource Acquisition Is Initialization)原则来管理资源,即资源的获取应该在对象的构造函数中进行,而资源的释放则应该在析构函数中进行。这样做的好处是,只要对象构造成功,就能确保资源被正确地释放,即使在发生异常的情况下也是如此。

  • 当发生异常时,C++ 的异常处理机制会自动调用栈上每个对象的析构函数,逐层释放资源。这是因为当异常抛出时,系统会进行栈的展开(Stack Unwinding),即回退当前函数调用栈。在回退过程中,每个对象的析构函数会依次被调用,进行资源的释放操作。

  • 总结起来,C++ 通过调用已构造对象的析构函数来释放资源,是为了确保资源的正确释放,避免资源泄漏的发生,同时符合 RAII 的设计原则。这种机制能够提高代码的可靠性和健壮性,并减少开发人员手动管理资源的工作量。

http://www.lryc.cn/news/131351.html

相关文章:

  • Windows定时任务计划无法显示任务程序界面的问题解决
  • 【Azure API 管理】APIM如何实现对部分固定IP进行访问次数限制呢?如60秒10次请求
  • Python学习笔记_进阶篇(二)_django知识(一)
  • 【hive】hive中row_number() rank() dense_rank()的用法
  • 【云原生】【k8s】Kubernetes+EFK构建日志分析安装部署
  • 计算实数数组中所有元素的绝对值 numpy.fabs()
  • 深入浅出Pytorch函数——torch.nn.init.orthogonal_
  • ORACLE中UNION、UNION ALL、MINUS、INTERSECT学习
  • 【k8s、云原生】基于metrics-server弹性伸缩
  • 回归预测 | MATLAB实现WOA-SVM鲸鱼算法优化支持向量机多输入单输出回归预测(多指标,多图)
  • VSCode快捷键
  • 贪心算法求数组中能组成三角形的最大周长
  • VMWare Workstation 17 Pro 网络设置 桥接模式 网络地址转换(NAT)模式 仅主机模式
  • 拒绝摆烂!C语言练习打卡第四天
  • KubeSphere 社区双周报 | Java functions framework 支持 SkyWalking | 2023.8.4-8.17
  • 【学习笔记之java】使用RestTemplate调用第三方接口
  • 数据集成革新:去中心化微服务集群的无限潜能
  • 后端返回可下载的xlsx文件,但是前端接收下载后为乱码
  • 提升资源管理效率必备工具推荐
  • HJ23 删除字符串中出现次数最少的字符
  • 文心一言 VS 讯飞星火 VS chatgpt (76)-- 算法导论7.3 1题
  • Leetcode - 滑动窗口
  • 如何保证数据传输的安全?
  • 政务、商务数据资源有效共享:让数据上“链”,记录每一个存储过程!
  • xml转map工具类
  • C++并发多线程--std::future_status、std::shared_future和std::atomic的使用
  • Redis在Java中的基本使用
  • 4.2 C++ Boost 内存池管理库
  • Django模型基础
  • 导读-Linux简介