More Effective C++ 条款11 禁止异常流出destructor之外
2015-06-26 20:45
344 查看
1. ”两种情况下destructor会被调用。第一种情况是当对象在正常情况下被销毁,也就是当它离开了它的生存空间或是被明确的删除;第二种情况是当对象被exception处理机制——也就是exception传播过程中的stack-unwinding(栈展开)机制——销毁。”
2. 当destructor被调用时,可能(也可能不)有一个exception正在作用之中,但我们无法再destructor中区分这些状态(现在有了区分的办法。1995年7月 IOS/ANSI C++ 标准委员会加入一个新函数: uncaught_exception。如果某个exception正在作用中而尚未被捕捉的话,它会返回true)。当destructor抛出一个异常的时候而不会被destructor捕捉的时候,它会传播到destructor的调用端,如果这个destructor本身是因他某个exception而被调用的,terminate函数便会被调用,它默认调用abort函数终止程序。
3. 对于2有一个解决办法可以防止destructor抛出的异常传出destructor之外,那就是将destructor函数体包在一个try块之中,而catch(...)语句什么也不做,示例代码如下:
View Code
4. 除了2所示原因,让exception传出destructor之外还有一个坏处:如果destructor抛出exception而没有在当地捕捉,那个destructor就是执行不全,也就是说它没有完成它应该完成的事情。
5. 综上,有两个理由支持我们采取措施阻止exception传出destructor之外:第一,它可以避免terminate函数在exception传播过程中的栈展开(stacking-unwinding)机制中被调用;第二,它可以协助确保destructors完成其应该完成的所有事情。
2. 当destructor被调用时,可能(也可能不)有一个exception正在作用之中,但我们无法再destructor中区分这些状态(现在有了区分的办法。1995年7月 IOS/ANSI C++ 标准委员会加入一个新函数: uncaught_exception。如果某个exception正在作用中而尚未被捕捉的话,它会返回true)。当destructor抛出一个异常的时候而不会被destructor捕捉的时候,它会传播到destructor的调用端,如果这个destructor本身是因他某个exception而被调用的,terminate函数便会被调用,它默认调用abort函数终止程序。
3. 对于2有一个解决办法可以防止destructor抛出的异常传出destructor之外,那就是将destructor函数体包在一个try块之中,而catch(...)语句什么也不做,示例代码如下:
~A(){ try{ ... } catch(...){} } //......代表中间的代码被省略,...代表C++的元运算符
View Code
4. 除了2所示原因,让exception传出destructor之外还有一个坏处:如果destructor抛出exception而没有在当地捕捉,那个destructor就是执行不全,也就是说它没有完成它应该完成的事情。
5. 综上,有两个理由支持我们采取措施阻止exception传出destructor之外:第一,它可以避免terminate函数在exception传播过程中的栈展开(stacking-unwinding)机制中被调用;第二,它可以协助确保destructors完成其应该完成的所有事情。
相关文章推荐
- 黑马程序员--c语言指针的基本知识
- C++运算符重载代码分析
- C和C++的struct区别
- 黑马程序员--c语言数据类型总结
- C++/VC++ 命名及其他规范
- C++模拟C#事件委托机制(二)
- C++模拟C#事件委托机制(一)
- C++的字符串分割函数
- C语言
- C++操作符重载
- MFC,VC++计算器小程序
- More Effective C++ 条款10 在构造函数内阻止内存泄露
- C++ STL中哈希表 hash_map从头到尾详细介绍
- C++的try catch到底能防止什么错误?
- 黑马程序员--c语言关键字,标示符,注释,数据,常量,变量介绍
- 【学习笔记】【C语言】变量类型
- Add Two Numbers - C++链表操作
- C语言概述
- C和C++动态内存的申请与释放思考(动态多维数组空间分配)
- More Effective C++ 条款9 利用 destructor 避免泄露资源