抛出异常时,将暂停当前函数的执行,开始查找匹配的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)相关推荐

  1. 栈展开(stack unwinding)

    栈展开(stack unwinding)的定义 抛出异常时,将暂停当前函数的执行,开始查找匹配的 catch 子句.首先检查 throw 本身是否在 try 块内部,如果是,检查与该 try 相关的 ...

  2. 抛出异常与栈展开(stack unwinding)

    抛出异常时,将暂停当前函数的执行,开始查找匹配的catch子句.首先检查throw本身是否在try块内部,如果是,检查与该try相关的catch子句,看是否可以处理该异常.如果不能处理,就退出当前函数 ...

  3. 栈展开(stack unwinding)在destructors中的exceptions

    抛出异常与栈展开(stack unwinding) 抛出异常时,将暂停当前函数的执行,开始查找匹配的catch子句.首先检查throw本身是否在try块内部,如果是,检查与该try相关的catch子句 ...

  4. noexcept与栈展开(stack unwinding)

    noexcept说明 在C++11之后,表示函数不会抛出异常的动态异常声明throw()被新的noexcept异常声明所取代. 该关键字告诉编译器,函数中不会发生异常,这有利于编译器对程序做更多的优化 ...

  5. C++ 栈展开如何防止内存泄露

    在栈展开(stack unwinding)是指,如果在一个函数内部抛出异常,而此异常并未在该函数内部被捕捉,就将导致该函数的运行在抛出异常处结束,所有已经分配在栈上的局部变量都要被释放.如果被释放的变 ...

  6. Java异常的栈轨迹(Stack Trace)

    捕获到异常时,往往需要进行一些处理.比较简单直接的方式就是打印异常栈轨迹Stack Trace.说起栈轨迹,可能很多人和我一样,第一反应就是printStackTrace()方法.其实除了这个方法,还 ...

  7. [转贴] 从零开始学C++之异常(二):程序错误、异常(语法、抛出、捕获、传播)、栈展开...

    一.程序错误 编译错误,即语法错误.程序就无法被生成运行代码. 运行时错误 不可预料的逻辑错误 可以预料的运行异常 例如: 动态分配空间时可能不会成功 打开文件可能会失败 除法运算时分母可能为0 整数 ...

  8. stack unwinding

    当抛出异常,程序的控制权由try block交给catch block时,C++ runtime自动调用try block里的所有auto和register对象的dtor函数,这个过程叫stack u ...

  9. 堆(heap)与栈(stack)的区别(一)

    堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收,但它与数据结构中的堆不是一回事,分配方式类似于链表. 栈(stack):由编译器自动分配和释放,存函数的参数值, ...

最新文章

  1. Git学习笔记一--创建版本库、添加文件、提交文件等
  2. 我在学习springboot和vue前后台连接时碰到的问题记录!(跨域问题)
  3. 查询字符串位置_带合并单元格的数据查询套路,有用
  4. Burpsuite中宏的使用
  5. 【教程】如何在标签打印工具TFORMer Designer中自定义布局?
  6. Android Studio(14)--点9图片怎么玩
  7. 添加七牛云存储_3月1日七牛云存储割韭菜的应对方法
  8. 如何使用SQL Server主数据服务替换硬编码的查找
  9. Oracle下载 OPatch
  10. LeetCode-11-Container With Most Water
  11. 漫画:一场大会,秀出了中国人自己的操作系统!
  12. SecureCRT中文汉化版和永久免费激活。
  13. 台式电脑经常碰到的一些问题
  14. python装饰器带参数函数二阶导数公式_SICP Python 描述 1.6 高阶函数
  15. You have not agreed to the Xcode license agreements. You must agree to both license agreements below
  16. 如何一键生成set、get、toString方法
  17. Prometheus监控系统存储容量优化攻略,让你的数据安心保存!
  18. 4.2 Lebesgue 积分的性质定理
  19. msgbox函数和msgbox语句
  20. pycharm关联hadoop开发

热门文章

  1. Angular2组件与指令的小实践——实现一个图片轮播组件
  2. 中国科学院大学2014年数学分析高等代数考研试题
  3. python中的enumerate函数
  4. 简单三个数比较大小 “?!”的用法
  5. 不带头结点链表,尾部插入法创建
  6. 手把手教你使用C#操作SQLite数据库,新建数据库,创建表,插入,查询,删除,运算符,like(持续更新)...
  7. Shell脚本编程----变量的使用
  8. Java_异常_04_ OutOfMemoryError系列
  9. React Native中常用ES6语法
  10. [科普]MinGW vs MinGW-W64及其它