抛出异常与栈展开(stack unwinding) http://www.cnblogs.com/zhuyf87/archive/2012/12/23/2829725.html
2016-03-18 23:10
357 查看
抛出异常与栈展开(stack unwinding)
抛出异常时,将暂停当前函数的执行,开始查找匹配的catch子句。首先检查throw本身是否在try块内部,如果是,检查与该try相关的catch子句,看是否可以处理该异常。如果不能处理,就退出当前函数,并且释放当前函数的内存并销毁局部对象,继续到上层的调用函数中查找,直到找到一个可以处理该异常的catch。这个过程称为栈展开(stack unwinding)。当处理该异常的catch结束之后,紧接着该catch之后的点继续执行。1. 为局部对象调用析构函数
如上所述,在栈展开的过程中,会释放局部对象所占用的内存并运行类类型局部对象的析构函数。但需要注意的是,如果一个块通过new动态分配内存,并且在释放该资源之前发生异常,该块因异常而退出,那么在栈展开期间不会释放该资源,编译器不会删除该指针,这样就会造成内存泄露。
2. 析构函数应该从不抛出异常
在为某个异常进行栈展开的时候,析构函数如果又抛出自己的未经处理的另一个异常,将会导致调用标准库terminate函数。通常terminate函数将调用abort函数,导致程序的非正常退出。所以析构函数应该从不抛出异常。
3. 异常与构造函数
如果在构造函数对象时发生异常,此时该对象可能只是被部分构造,要保证能够适当的撤销这些已构造的成员。
4. 未捕获的异常将会终止程序
不能不处理异常。如果找不到匹配的catch,程序就会调用库函数terminate。
【学习资料】 《c++ primer》
相关文章推荐
- 网络传输的本质(buffer传输)决定了序列化和反序列化的重要应用
- 树莓派没有显示器时的网络连接
- Genymotion添加模拟器时报“Unable to create virtual device,Server returned HTTP status code 0”
- Java 被访问时报 the method getDispatcherType() is undefined for the type HttpServletRequest
- centos7 无线网卡驱动的安装及无线网络的配置
- Linux网络流量监控与分析工具Ntopng
- FEC(Forward Error Correction)前向纠错 UDP\RTP 中使用用于改善无线等网络丢包等问题
- 高效地配置okhttp
- bzoj 2816: [ZJOI2012]网络(splay)
- Android好用的okhttp网络封装(get,post,上传,下载)
- http协议(2)
- 极路由的“802.1x手机号登陆wifi”插件,电脑连接wifi方法
- TCP/IP协议栈
- http status 400,http 400,400 错误
- 1570: [JSOI2008]Blue Mary的旅行|网络流
- TCP协议连接建立与连接断开过程(含断开时的TCP状态图)
- 压测网络随记
- IOS 网络浅析-(七 JSON解析之三方JSONKit)
- 基于TCP协议的Socket编程,实现文件的上传
- 常见http状态码详解