您的位置:首页 > 编程语言 > C语言/C++

【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()。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: