c++异常
来源:互联网 发布:个人淘宝贷款怎么申请 编辑:程序博客网 时间:2024/06/05 23:00
抛出异常与栈展开(stack unwinding)
抛出异常时,将暂停当前函数的执行,开始查找匹配的catch子句。首先检查throw本身是否在try块内部,如果是,检查与该try相关的catch子句,看是否可以处理该异常。如果不能处理,就退出当前函数,并且释放当前函数的内存并销毁局部对象,继续到上层的调用函数中查找,直到找到一个可以处理该异常的catch。这个过程称为栈展开(stack unwinding)。当处理该异常的catch结束之后,紧接着该catch之后的点继续执行。
1. 为局部对象调用析构函数
如上所述,在栈展开的过程中,会释放局部对象所占用的内存并运行类类型局部对象的析构函数。但需要注意的是,如果一个块通过new动态分配内存,并且在释放该资源之前发生异常,该块因异常而退出,那么在栈展开期间不会释放该资源,编译器不会删除该指针,这样就会造成内存泄露。
2. 析构函数应该从不抛出异常
在为某个异常进行栈展开的时候,析构函数如果又抛出自己的未经处理的另一个异常,将会导致调用标准库terminate函数。通常terminate函数将调用abort函数,导致程序的非正常退出。所以析构函数应该从不抛出异常。
3. 异常与构造函数
如果在构造函数对象时发生异常,此时该对象可能只是被部分构造,要保证能够适当的撤销这些已构造的成员。
4. 未捕获的异常将会终止程序
不能不处理异常。如果找不到匹配的catch,程序就会调用库函数terminate。
阅读全文
0 0
- C异常
- 【c++】异常
- 【C/C++】异常机制
- 异常类型 描述(C#)
- c#中的异常处理
- Exception异常类(C#)
- 捕捉异常 (Visual C#)
- 异常处理 - [C++]
- c异常处理
- Objective-c异常处理
- VS2005(C#)异常解决方案
- object-c 异常
- C语言异常处理
- c 异常处理
- Objective-C中的异常
- C编译异常集锦
- 用C模拟异常
- C 异常处理设计
- 关于开机时候的一些问题
- CSU 1047 最长上升子序列 (二分水过)
- 不怕进度慢,就怕进度慢
- LeetCode_111
- 15个顶级Java多线程面试题及答案
- c++异常
- 线段树的数组大小下限及证明
- BFS(广度优先搜索)这里用来两种方法存储路径,1.同map大小的数组来存储路径2.通过生成反向树状结构存储路径
- JavaScript-jQuerry_DOM操作
- 对双机调试的探索
- 二分查找及python实现
- HDU-1536-S-Nim && HDU-1944
- Apache中的.htaccess文件
- CodeVS1298 凸包周长 解题报告【计算几何】【凸包】