抛出异常与栈展开(stack unwinding)
抛出异常时,将暂停当前函数的执行,开始查找匹配的catch子句。首先检查throw本身是否在try块内部,如果是,检查与该try相关的catch子句,看是否可以处理该异常。如果不能处理,就退出当前函数,并且释放当前函数的内存并销毁局部对象,继续到上层的调用函数中查找,直到找到一个可以处理该异常的catch。这个过程称为栈展开(stack unwinding)。当处理该异常的catch结束之后,紧接着该catch之后的点继续执行。
1. 为局部对象调用析构函数
如上所述,在栈展开的过程中,会释放局部对象所占用的内存并运行类类型局部对象的析构函数。但需要注意的是,如果一个块通过new动态分配内存,并且在释放该资源之前发生异常,该块因异常而退出,那么在栈展开期间不会释放该资源,编译器不会删除该指针,这样就会造成内存泄露。
2. 析构函数应该从不抛出异常
在为某个异常进行栈展开的时候,析构函数如果又抛出自己的未经处理的另一个异常,将会导致调用标准库terminate函数。通常terminate函数将调用abort函数,导致程序的非正常退出。所以析构函数应该从不抛出异常。
3. 异常与构造函数
如果在构造函数对象时发生异常,此时该对象可能只是被部分构造,要保证能够适当的撤销这些已构造的成员。
4. 未捕获的异常将会终止程序
不能不处理异常。如果找不到匹配的catch,程序就会调用库函数terminate。
抛出异常与栈展开(stack unwinding)相关推荐
- 栈展开(stack unwinding)
栈展开(stack unwinding)的定义 抛出异常时,将暂停当前函数的执行,开始查找匹配的 catch 子句.首先检查 throw 本身是否在 try 块内部,如果是,检查与该 try 相关的 ...
- c++抛出异常与栈展开(stack unwinding)
抛出异常时,将暂停当前函数的执行,开始查找匹配的catch子句.首先检查throw本身是否在try块内部,如果是,检查与该try相关的catch子句,看是否可以处理该异常.如果不能处理,就退出当前函数 ...
- 栈展开(stack unwinding)在destructors中的exceptions
抛出异常与栈展开(stack unwinding) 抛出异常时,将暂停当前函数的执行,开始查找匹配的catch子句.首先检查throw本身是否在try块内部,如果是,检查与该try相关的catch子句 ...
- noexcept与栈展开(stack unwinding)
noexcept说明 在C++11之后,表示函数不会抛出异常的动态异常声明throw()被新的noexcept异常声明所取代. 该关键字告诉编译器,函数中不会发生异常,这有利于编译器对程序做更多的优化 ...
- C++ 栈展开如何防止内存泄露
在栈展开(stack unwinding)是指,如果在一个函数内部抛出异常,而此异常并未在该函数内部被捕捉,就将导致该函数的运行在抛出异常处结束,所有已经分配在栈上的局部变量都要被释放.如果被释放的变 ...
- Java异常的栈轨迹(Stack Trace)
捕获到异常时,往往需要进行一些处理.比较简单直接的方式就是打印异常栈轨迹Stack Trace.说起栈轨迹,可能很多人和我一样,第一反应就是printStackTrace()方法.其实除了这个方法,还 ...
- [转贴] 从零开始学C++之异常(二):程序错误、异常(语法、抛出、捕获、传播)、栈展开...
一.程序错误 编译错误,即语法错误.程序就无法被生成运行代码. 运行时错误 不可预料的逻辑错误 可以预料的运行异常 例如: 动态分配空间时可能不会成功 打开文件可能会失败 除法运算时分母可能为0 整数 ...
- stack unwinding
当抛出异常,程序的控制权由try block交给catch block时,C++ runtime自动调用try block里的所有auto和register对象的dtor函数,这个过程叫stack u ...
- 堆(heap)与栈(stack)的区别(一)
堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收,但它与数据结构中的堆不是一回事,分配方式类似于链表. 栈(stack):由编译器自动分配和释放,存函数的参数值, ...
最新文章
- 关于csgo的观看录像fps低_中国CSGO神秘天才欲初登赛场!却因这件事被无数人所质疑!!...
- Python中内建模块collections常见用法总结
- FFT IP核调用与仿真之FFT数学分析
- CSS基础(part22)--2D转换
- 微软全都要!Win10引入真Linux内核
- mybatis 逆向工程生成的 Example 类的使用
- 调研了2000位CEO,67%的企业都在数字化转型,想做的无非这3点
- nginx反向代理docker registry报”blob upload unknown解决办法
- android项目修改名字(app名称),运行在移动设备和模拟器上的项目名字
- AD 删除原理图图纸外的器件
- linux系统编程之管道(三):命名管道FIFO和mkfifo函数
- 微信小程序 java多商家多用户网上商城购物系统#计算机毕业设计
- Celery 全面学习笔记
- 农行上海研发中心面经
- gff文件_GTF与GFF文件所有操作尽在这里
- python模糊路径读取文件
- 雅马哈机械手程序 程序里有跟相机Socket通信数据处理,此流程为锁螺丝
- android 通知中心,你的 Android 通知中心从未如此井然有序过:个性通知
- sEMG项目总结(2)康复手控制系统
- spring boot 源码解析29-LogbackLoggingSystem