抛出异常与栈展开(stack unwinding)
来源:互联网 发布:詹姆斯个人数据统计 编辑:程序博客网 时间:2024/05/06 22:53
抛出异常时,将暂停当前函数的执行,开始查找匹配的catch子句。首先检查throw本身是否在try块内部,如果是,检查与该try相关的catch子句,看是否可以处理该异常。如果不能处理,就退出当前函数,并且释放当前函数的内存并销毁局部对象,继续到上层的调用函数中查找,直到找到一个可以处理该异常的catch。这个过程称为栈展开(stack unwinding)。当处理该异常的catch结束之后,紧接着该catch之后的点继续执行。
1. 为局部对象调用析构函数
如上所述,在栈展开的过程中,会释放局部对象所占用的内存并运行类类型局部对象的析构函数。但需要注意的是,如果一个块通过new动态分配内存,并且在释放该资源之前发生异常,该块因异常而退出,那么在栈展开期间不会释放该资源,编译器不会删除该指针,这样就会造成内存泄露。
2. 析构函数应该从不抛出异常
在为某个异常进行栈展开的时候,析构函数如果又抛出自己的未经处理的另一个异常,将会导致调用标准库terminate函数。通常terminate函数将调用abort函数,导致程序的非正常退出。所以析构函数应该从不抛出异常。
3. 异常与构造函数
如果在构造函数对象时发生异常,此时该对象可能只是被部分构造,要保证能够适当的撤销这些已构造的成员。
4. 未捕获的异常将会终止程序
不能不处理异常。如果找不到匹配的catch,程序就会调用库函数terminate。
【学习资料】 《c++ primer》
0 0
- 抛出异常与栈展开(stack unwinding)
- 抛出异常与栈展开(stack unwinding)
- 抛出异常与栈展开(stack unwinding)
- 抛出异常与栈展开(stack unwinding)
- 抛出异常与栈展开(stack unwinding)http://www.cnblogs.com/zhuyf87/archive/2012/12/23/2829725.html
- 抛出异常与栈展开(stack unwinding) http://www.cnblogs.com/zhuyf87/archive/2012/12/23/2829725.html
- C++异常(2) - 栈展开(stack unwinding)
- C++异常(2) - 栈展开(stack unwinding)
- 栈展开(stack unwinding)&在destructors中的exceptions
- 栈开解(stack unwinding)
- stack unwinding
- Stack unwinding
- stack unwinding
- 从零开始学C++之异常(二):程序错误、异常(语法、抛出、捕获、传播)、栈展开
- 从零开始学C++之异常(二):程序错误、异常(语法、抛出、捕获、传播)、栈展开
- 从零开始学C++之异常(二):程序错误、异常(语法、抛出、捕获、传播)、栈展开
- 关于Stack unwinding
- c++ stack unwinding
- 排序算法——快速排序
- android随机生成验证码
- opencv实现图片HDR功能
- HDOJ 2092 整数解(2次方程整数解公式)
- iOS 强弱引用
- 抛出异常与栈展开(stack unwinding)
- view.layer.shouldRasterize = YES(光栅化)的使用 及图片性能整理
- mysql数据库安装的时候可能出现的问题及解决办法
- 等额本金
- 字符串类——NSString/NSMutableString
- 关于AndroidStudio运行项目时出现 Could not create plugin of type 'AppPlugin'.
- 《软件架构设计》学习笔记--4--架构设计的过程概述
- Unity3D 获取与设置对象Transform组件下的position,rotation
- 如何变得更聪明?