抛出异常与栈展开(stack unwinding) http://www.cnblogs.com/zhuyf87/archive/2012/12/23/2829725.html
来源:互联网 发布:知乎推荐的淘宝包店 编辑:程序博客网 时间:2024/04/28 15:46
抛出异常与栈展开(stack unwinding)
抛出异常时,将暂停当前函数的执行,开始查找匹配的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)http://www.cnblogs.com/zhuyf87/archive/2012/12/23/2829725.html
- 抛出异常与栈展开(stack unwinding) http://www.cnblogs.com/zhuyf87/archive/2012/12/23/2829725.html
- 抛出异常与栈展开(stack unwinding)
- 抛出异常与栈展开(stack unwinding)
- 抛出异常与栈展开(stack unwinding)
- 抛出异常与栈展开(stack unwinding)
- 树、森林和二叉树的转换http://www.cnblogs.com/zhuyf87/archive/2012/11/04/2753950.html
- 构造函数、析构函数抛出异常的问题http://www.cnblogs.com/fly1988happy/archive/2012/04/11/2442765.html
- http://www.cnblogs.com/hemingwang0902/archive/2012/03/15/2397761.html异常的解决方案
- http详解(http://www.cnblogs.com/TankXiao/archive/2012/02/13/2342672.html)
- android boot 代码流程http://www.cnblogs.com/idiottiger/archive/2012/05/23/2513494.html
- exec函数族实例解析http://www.cnblogs.com/blankqdb/archive/2012/08/23/2652386.html
- http://www.cnblogs.com/iminto/archive/2010/12/23/1915232.html
- http://www.cnblogs.com/Olive116/archive/2012/11/12/2765934.html
- jQuery动态表格(转自:http://www.cnblogs.com/Zjmainstay/archive/2012/07/12/jQuery_autoAddDeleteTableTr.html)
- 原文地址http://www.cnblogs.com/biyeymyhjob/archive/2012/07/12/2588074.html
- makefile @ 符号作用 http://www.cnblogs.com/MyEyes/archive/2012/01/12/2320505.html
- VS2010创建并使用DLL http://www.cnblogs.com/laogao/archive/2012/12/07/2806528.html
- Jedis2.8.1 缺少setMaxActive的问题
- 【杭电】[1716]排列2
- Android 自定义RatingBar
- 粒子群算法实现之python
- JS无法修改referer
- 抛出异常与栈展开(stack unwinding) http://www.cnblogs.com/zhuyf87/archive/2012/12/23/2829725.html
- git上传忽略文件功能
- 111. Minimum Depth of Binary Tree
- Android Broadcast------详解广播机制
- 2016春季练习——set判重
- JAVA面向对象之多态性
- BZOJ_P3172 [Tjoi2013]单词(AC自动机)
- remove duplicates from sorted list
- AlarmManager系统闹钟