抛出异常时,将暂停当前函数的执行,开始查找匹配的catch子句。首先检查throw本身是否在try块内部,如果是,检查与该try相关的catch子句,看是否可以处理该异常。如果不能处理,就退出当前函数,并且释放当前函数的内存并销毁局部对象,继续到上层的调用函数中查找,直到找到一个可以处理该异常的catch。这个过程称为栈展开(stack unwinding)。当处理该异常的catch结束之后,紧接着该catch之后的点继续执行。

1. 为局部对象调用析构函数

如上所述,在栈展开的过程中,会释放局部对象所占用的内存并运行类类型局部对象的析构函数。但需要注意的是,如果一个块通过new动态分配内存,并且在释放该资源之前发生异常,该块因异常而退出,那么在栈展开期间不会释放该资源,编译器不会删除该指针,这样就会造成内存泄露。

2. 析构函数应该从不抛出异常

在为某个异常进行栈展开的时候,析构函数如果又抛出自己的未经处理的另一个异常,将会导致调用标准库terminate函数。通常terminate函数将调用abort函数,导致程序的非正常退出。所以析构函数应该从不抛出异常。

3. 异常与构造函数

如果在构造函数对象时发生异常,此时该对象可能只是被部分构造,要保证能够适当的撤销这些已构造的成员。

4. 未捕获的异常将会终止程序

不能不处理异常。如果找不到匹配的catch,程序就会调用库函数terminate。

抛出异常与栈展开(stack unwinding)相关推荐

  1. 栈展开(stack unwinding)

    栈展开(stack unwinding)的定义 抛出异常时,将暂停当前函数的执行,开始查找匹配的 catch 子句.首先检查 throw 本身是否在 try 块内部,如果是,检查与该 try 相关的 ...

  2. c++抛出异常与栈展开(stack unwinding)

    抛出异常时,将暂停当前函数的执行,开始查找匹配的catch子句.首先检查throw本身是否在try块内部,如果是,检查与该try相关的catch子句,看是否可以处理该异常.如果不能处理,就退出当前函数 ...

  3. 栈展开(stack unwinding)在destructors中的exceptions

    抛出异常与栈展开(stack unwinding) 抛出异常时,将暂停当前函数的执行,开始查找匹配的catch子句.首先检查throw本身是否在try块内部,如果是,检查与该try相关的catch子句 ...

  4. noexcept与栈展开(stack unwinding)

    noexcept说明 在C++11之后,表示函数不会抛出异常的动态异常声明throw()被新的noexcept异常声明所取代. 该关键字告诉编译器,函数中不会发生异常,这有利于编译器对程序做更多的优化 ...

  5. C++ 栈展开如何防止内存泄露

    在栈展开(stack unwinding)是指,如果在一个函数内部抛出异常,而此异常并未在该函数内部被捕捉,就将导致该函数的运行在抛出异常处结束,所有已经分配在栈上的局部变量都要被释放.如果被释放的变 ...

  6. Java异常的栈轨迹(Stack Trace)

    捕获到异常时,往往需要进行一些处理.比较简单直接的方式就是打印异常栈轨迹Stack Trace.说起栈轨迹,可能很多人和我一样,第一反应就是printStackTrace()方法.其实除了这个方法,还 ...

  7. [转贴] 从零开始学C++之异常(二):程序错误、异常(语法、抛出、捕获、传播)、栈展开...

    一.程序错误 编译错误,即语法错误.程序就无法被生成运行代码. 运行时错误 不可预料的逻辑错误 可以预料的运行异常 例如: 动态分配空间时可能不会成功 打开文件可能会失败 除法运算时分母可能为0 整数 ...

  8. stack unwinding

    当抛出异常,程序的控制权由try block交给catch block时,C++ runtime自动调用try block里的所有auto和register对象的dtor函数,这个过程叫stack u ...

  9. 堆(heap)与栈(stack)的区别(一)

    堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收,但它与数据结构中的堆不是一回事,分配方式类似于链表. 栈(stack):由编译器自动分配和释放,存函数的参数值, ...

最新文章

  1. 关于csgo的观看录像fps低_中国CSGO神秘天才欲初登赛场!却因这件事被无数人所质疑!!...
  2. Python中内建模块collections常见用法总结
  3. FFT IP核调用与仿真之FFT数学分析
  4. CSS基础(part22)--2D转换
  5. 微软全都要!Win10引入真Linux内核
  6. mybatis 逆向工程生成的 Example 类的使用
  7. 调研了2000位CEO,67%的企业都在数字化转型,想做的无非这3点
  8. nginx反向代理docker registry报”blob upload unknown解决办法
  9. android项目修改名字(app名称),运行在移动设备和模拟器上的项目名字
  10. AD 删除原理图图纸外的器件
  11. linux系统编程之管道(三):命名管道FIFO和mkfifo函数
  12. 微信小程序 java多商家多用户网上商城购物系统#计算机毕业设计
  13. Celery 全面学习笔记
  14. 农行上海研发中心面经
  15. gff文件_GTF与GFF文件所有操作尽在这里
  16. python模糊路径读取文件
  17. 雅马哈机械手程序 程序里有跟相机Socket通信数据处理,此流程为锁螺丝
  18. android 通知中心,你的 Android 通知中心从未如此井然有序过:个性通知
  19. sEMG项目总结(2)康复手控制系统
  20. spring boot 源码解析29-LogbackLoggingSystem

热门文章

  1. 生产者消费者模型(C++)
  2. 2023年2月的十篇深度学习论文推荐
  3. 编译错误及解决方案汇总
  4. 第四章 序列式容器(sequence containers)
  5. pandas中强大的绘制图表功能——DataFrame.hist(),以及统计分析函数——DataFrame.describe()
  6. logging日志管理
  7. 【Apollo配置中心】Apollo环境配置
  8. 高质量程序设计指南C++学习总结二
  9. TTL与非门多余的输入端处置办法及其优缺点
  10. 图解蓝牙 BR/EDR 和BLE的区别