条款八 别让异常逃离析构函数
2012-07-24 01:02
176 查看
1.最好是不要让析构函数吐出异常,如果析构函数吐出异常而且程序没有结束,这会导致不明确的行为
当异常抛出时,本身函数就结束,函数里的后续处理就不会执行,这要是发生在析构函数里,可能因为
异常而导致后续的数据释放没有完成,造成内存泄露
两种不是很好的解决方法
(1) 结束整个程序:Test *p = new Test;
try{ delete p; }
catch(...)
{
abort(); //直接结束程序,程序结束后系统自动会收回所为程序分配的内存
}
(2) 吞掉异常,对异常不做处理Test *p = new Test;
try{ delete p; }
catch(...){}
2."双保险",把可能发生异常的处理放到析构函数以外的函数,如果那个函数没有执行或者发送异常,则再到析构函数里处理
其实这个方法也没有多少好处,但是提供一个管理类,使得用户有了选择,而且减少了在析构函数里吐异常的可能
当异常抛出时,本身函数就结束,函数里的后续处理就不会执行,这要是发生在析构函数里,可能因为
异常而导致后续的数据释放没有完成,造成内存泄露
class Test { public: Test(){ p = new char[4]; } ~Test() { throw("exception"); //退出析构函数 delete p; //不会执行 } private: char *p; };
两种不是很好的解决方法
(1) 结束整个程序:Test *p = new Test;
try{ delete p; }
catch(...)
{
abort(); //直接结束程序,程序结束后系统自动会收回所为程序分配的内存
}
(2) 吞掉异常,对异常不做处理Test *p = new Test;
try{ delete p; }
catch(...){}
2."双保险",把可能发生异常的处理放到析构函数以外的函数,如果那个函数没有执行或者发送异常,则再到析构函数里处理
其实这个方法也没有多少好处,但是提供一个管理类,使得用户有了选择,而且减少了在析构函数里吐异常的可能
class Test_1 { public: void close(){....} //可能发生异常的函数 }; class Test_2 //定义一个管理类 { public: Test_2(){ isClose = false} void close() { t1.close(); //若发生异常,下面的语句不会被执行 isClose = true; } ~Test_2() { if(!isClose) { try{ t1.close(); } //这个类的close()没有被使用或者发送异常,所以在析构函数里调用t1.close()关闭 catch(...){} //这里可以使用结束整个程序或者吞掉异常方法处理 } } private: Test_1 t1; bool isClose; };
相关文章推荐
- Effective C++ 条款08 别让异常逃离析构函数
- 读书笔记《Effective c++》 条款08 别让异常逃离析构函数
- Effective C++_笔记_条款08_别让异常逃离析构函数
- effective c++条款08别让异常逃离析构函数
- Effective C++ 条款八 别让异常逃离析构函数
- 读书笔记_Effective_C++_条款八:别让异常逃离析构函数
- [Effective C++]条款08 别让异常逃离析构函数
- EC读书笔记系列之4:条款8 别让异常逃离析构函数
- 《Effective C++》学习笔记条款08 别让异常逃离析构函数
- 条款08 别让异常逃离析构函数
- 条款 08 别让异常逃离析构函数
- 条款08 别让异常逃离析构函数
- Effective C++ 条款08 别让异常逃离析构函数
- effective c++ 条款7,8(为多态基类声明virtual析构函数,别让异常逃离析构函数)
- Effective C++ -----条款08: 别让异常逃离析构函数
- Effective C++ 条款8 别让异常逃离析构函数
- C++ 别让异常逃离析构函数
- 条款8:别让异常逃离析构函数
- Effective C++笔记之五 别让异常逃离析构函数
- [Effective C++ --008]别让异常逃离析构函数