析构函数不应该抛出异常
2013-05-09 19:31
155 查看
1、构造函数可以抛出异常,但最好不要。
2、c++标准指明析构函数不能、也不应该抛出异常。
more effective c++关于第2点提出两点理由:
1)如果析构函数抛出异常,则异常点之后的程序不会执行,如果析构函数在异常点之后执行了某些必要的动作比如释放某些资源,则这些动作不会执行,会造成诸如资源泄漏的问题。
2)通常异常发生时,c++的机制会调用已经构造对象的析构函数来释放资源,此时若析构函数本身也抛出异常,则前一个异常尚未处理,又有新的异常,会造成程序崩溃的问题。
解决办法:
1)永远不要在析构函数抛出异常。
2)通常第一点有时候不能保证。可以采取如下的方法:
~ClassName()
{
try{
do_something();
}
catch(){ //这里可以什么都不做,只是保证catch块的程序抛出的异常不会被扔出析构函数之外,即让程序吞下异常。或者调用std::abort()终止程序。
}
}
2、c++标准指明析构函数不能、也不应该抛出异常。
more effective c++关于第2点提出两点理由:
1)如果析构函数抛出异常,则异常点之后的程序不会执行,如果析构函数在异常点之后执行了某些必要的动作比如释放某些资源,则这些动作不会执行,会造成诸如资源泄漏的问题。
2)通常异常发生时,c++的机制会调用已经构造对象的析构函数来释放资源,此时若析构函数本身也抛出异常,则前一个异常尚未处理,又有新的异常,会造成程序崩溃的问题。
解决办法:
1)永远不要在析构函数抛出异常。
2)通常第一点有时候不能保证。可以采取如下的方法:
~ClassName()
{
try{
do_something();
}
catch(){ //这里可以什么都不做,只是保证catch块的程序抛出的异常不会被扔出析构函数之外,即让程序吞下异常。或者调用std::abort()终止程序。
}
}
相关文章推荐
- 为什么在析构函数中不应该抛出异常?
- 析构函数中不应该抛出异常(摘录)
- 构造函数、析构函数 与抛出异常
- 析构函数中抛出的异常
- C++类的析构函数不能抛出异常
- 析构函数不能抛出异常
- 为什么析构函数不能抛出异常
- 应该抛出什么异常?不应该抛出什么异常?(.NET/C#)
- 不能在析构函数里面抛出异常
- 构造函数、析构函数抛出异常的问题http://www.cnblogs.com/fly1988happy/archive/2012/04/11/2442765.html
- 不能在析构函数里面抛出异常 http://blog.csdn.net/wind19/article/details/8213406
- C++构造函数、析构函数与抛出异常
- 构造函数、析构函数可以抛出异常吗?为什么?(一道百度面试题)
- 不能在析构函数里面抛出异常
- 构造函数、析构函数抛出异常的问题
- C++ 异常 与 ”为什么析构函数不能抛出异常“ 问题
- C++中构造函数和析构函数可以抛出异常吗?
- 构造函数、析构函数抛出异常
- 析构函数中不能抛出异常的原因
- 构造函数中可不可以抛出异常?析构函数呢?