【effective c++】C++构造函数、析构函数与抛出异常
2011-07-05 17:01
267 查看
问题:
构造函数可以抛出异常么?析构函数可以吗?
从语法上来说,构造函数和析构函数都可以抛出异常。但从逻辑上和风险控制上,构造函数可以,析构函数不推荐抛出异常。(参见effective c++ 条款08 别让异常逃离析构函数)
1、构造函数可以抛出异常:
无论何时,从构造函数中抛出异常都是可以的。动态创建对象要进行两个操作:分配内存和调用构造函数。若在分配内存时出错,会抛出bad_alloc异常;若在调用构造函数初始化时出错,会不会存在内存泄漏呢?答案是不会。
new运算符保证不会出现内存泄漏:
T *p = new T;将被编译器转换给类似下面的样子:// 第一步,分配原始内存,若失败则抛出bad_alloc异常try { // 第二步,调用构造函数构造对象 new (p)T; // placement new: 只调用T的构造函数}catch(...) { delete p; // 释放第一步分配的内存 throw; // 重抛异常,通知应用程序}
2、c++不推荐从析构函数中抛出异常,必须要求在析构函数内消化所有异常。
因为析构函数可能在对象正常结束生命周期时调用,也可能在有异常发生时从函数堆栈清理时调用。前一种情况抛出异常不会有无法预料的结果,可以正常捕获;但后一种情况下,因为已经发生了异常而导致函数的局部变量的析构函数被调用,此时析构函数又抛出异常。在两个异常同时存在的情况下,异常处理机制只能调用terminate()。
构造函数可以抛出异常么?析构函数可以吗?
从语法上来说,构造函数和析构函数都可以抛出异常。但从逻辑上和风险控制上,构造函数可以,析构函数不推荐抛出异常。(参见effective c++ 条款08 别让异常逃离析构函数)
1、构造函数可以抛出异常:
无论何时,从构造函数中抛出异常都是可以的。动态创建对象要进行两个操作:分配内存和调用构造函数。若在分配内存时出错,会抛出bad_alloc异常;若在调用构造函数初始化时出错,会不会存在内存泄漏呢?答案是不会。
new运算符保证不会出现内存泄漏:
T *p = new T;将被编译器转换给类似下面的样子:// 第一步,分配原始内存,若失败则抛出bad_alloc异常try { // 第二步,调用构造函数构造对象 new (p)T; // placement new: 只调用T的构造函数}catch(...) { delete p; // 释放第一步分配的内存 throw; // 重抛异常,通知应用程序}
2、c++不推荐从析构函数中抛出异常,必须要求在析构函数内消化所有异常。
因为析构函数可能在对象正常结束生命周期时调用,也可能在有异常发生时从函数堆栈清理时调用。前一种情况抛出异常不会有无法预料的结果,可以正常捕获;但后一种情况下,因为已经发生了异常而导致函数的局部变量的析构函数被调用,此时析构函数又抛出异常。在两个异常同时存在的情况下,异常处理机制只能调用terminate()。
相关文章推荐
- C++构造函数、析构函数与抛出异常
- C++构造函数和析构函数中抛出异常的注意事项
- C++关于构造函数 和 析构函数 能否抛出异常的讨论
- [c/c++]构造函数、析构函数中可不可以抛出异常
- C++之构造函数、析构函数抛出异常的问题
- C++中构造函数和析构函数可以抛出异常吗?
- c++能否在析构函数和构造函数中抛出异常?
- C++中构造函数和析构函数抛出异常问题
- C++中构造函数和析构函数可以抛出异常吗?
- 构造函数和析构函数中抛出异常
- 关于构造函数 和 析构函数 能否抛出异常的讨论
- C++ 为什么析构函数不能抛出异常
- C++ 异常 与 ”为什么析构函数不能抛出异常“ 问题
- C++构造函数中抛出异常要注意
- 关于构造函数 和 析构函数 能否抛出异常的讨论
- 构造函数、析构函数抛出异常的问题
- C++ - 谨防因构造函数抛出异常而引发的问题
- effective C++之析构函数不该抛出异常
- 是否能在构造函数,析构函数中抛出异常?
- C++ 构造函数抛出异常会引起内存泄漏吗?