c++抛出异常与栈展开(stack unwinding)
抛出异常时,将暂停当前函数的执行,开始查找匹配的catch子句。首先检查throw本身是否在try块内部,如果是,检查与该try相关的catch子句,看是否可以处理该异常。如果不能处理,就退出当前函数,并且释放当前函数的内存并销毁局部对象,继续到上层的调用函数中查找,直到找到一个可以处理该异常的catch。这个过程称为栈展开(stack unwinding)。当处理该异常的catch结束之后,紧接着该catch之后的点继续执行。
1. 为局部对象调用析构函数
如上所述,在栈展开的过程中,会释放局部对象所占用的内存并运行类类型局部对象的析构函数。但需要注意的是,如果一个块通过new动态分配内存,并且在释放该资源之前发生异常,该块因异常而退出,那么在栈展开期间不会释放该资源,编译器不会删除该指针,这样就会造成内存泄露。
2. 析构函数应该从不抛出异常
在为某个异常进行栈展开的时候,析构函数如果又抛出自己的未经处理的另一个异常,将会导致调用标准库terminate函数。通常terminate函数将调用abort函数,导致程序的非正常退出。所以析构函数应该从不抛出异常。
3. 异常与构造函数
如果在构造函数对象时发生异常,此时该对象可能只是被部分构造,要保证能够适当的撤销这些已构造的成员。
4. 未捕获的异常将会终止程序
不能不处理异常。如果找不到匹配的catch,程序就会调用库函数terminate。
转载于:https://www.cnblogs.com/limeina/p/3664453.html
c++抛出异常与栈展开(stack unwinding)相关推荐
- 栈展开(stack unwinding)
栈展开(stack unwinding)的定义 抛出异常时,将暂停当前函数的执行,开始查找匹配的 catch 子句.首先检查 throw 本身是否在 try 块内部,如果是,检查与该 try 相关的 ...
- 抛出异常与栈展开(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):由编译器自动分配和释放,存函数的参数值, ...
最新文章
- Git学习笔记一--创建版本库、添加文件、提交文件等
- 我在学习springboot和vue前后台连接时碰到的问题记录!(跨域问题)
- 查询字符串位置_带合并单元格的数据查询套路,有用
- Burpsuite中宏的使用
- 【教程】如何在标签打印工具TFORMer Designer中自定义布局?
- Android Studio(14)--点9图片怎么玩
- 添加七牛云存储_3月1日七牛云存储割韭菜的应对方法
- 如何使用SQL Server主数据服务替换硬编码的查找
- Oracle下载 OPatch
- LeetCode-11-Container With Most Water
- 漫画:一场大会,秀出了中国人自己的操作系统!
- SecureCRT中文汉化版和永久免费激活。
- 台式电脑经常碰到的一些问题
- python装饰器带参数函数二阶导数公式_SICP Python 描述 1.6 高阶函数
- You have not agreed to the Xcode license agreements. You must agree to both license agreements below
- 如何一键生成set、get、toString方法
- Prometheus监控系统存储容量优化攻略,让你的数据安心保存!
- 4.2 Lebesgue 积分的性质定理
- msgbox函数和msgbox语句
- pycharm关联hadoop开发
热门文章
- Angular2组件与指令的小实践——实现一个图片轮播组件
- 中国科学院大学2014年数学分析高等代数考研试题
- python中的enumerate函数
- 简单三个数比较大小 “?!”的用法
- 不带头结点链表,尾部插入法创建
- 手把手教你使用C#操作SQLite数据库,新建数据库,创建表,插入,查询,删除,运算符,like(持续更新)...
- Shell脚本编程----变量的使用
- Java_异常_04_ OutOfMemoryError系列
- React Native中常用ES6语法
- [科普]MinGW vs MinGW-W64及其它