异常处理可能出现的问题

时间:2010-12-15 08:40:48

标签: c++ exception-handling

这个问题的灵感来自这篇文章:reason for memory leakage in C C++

由于使用例外,可能出现的另一类问题是什么?

我的意思是在使用异常处理时我们应该记住哪些问题

3 个答案:

答案 0 :(得分:4)

实际上,如果抛出一个意外的异常,任何算法都会中断。

例如,算法需要按顺序执行两个操作,第二个操作会导致异常 - 第一个不会被取消(除非你处理这个)并且程序现在处于不一致状态。在这种情况下,您链接到不一致表现为内存泄漏 - 代码意图解除分配内存,但由于异常而未运行解除分配代码。

解决方案是期望例外并使用RAII来管理资源和状态一致性。例如,如果需要执行两个操作,首先在堆栈上创建“括号类”实例,在第二个操作完成后,在该实例上运行一个特殊方法,这意味着两个操作都已成功运行。如果抛出异常,该类的析构函数将回滚第一个动作。

答案 1 :(得分:2)

Bjarne Stroustrup已经提供the chapter on exception safety The C ++ Programming Language,3rd ed 。)。

此外,您必须确保在呼叫中途中断您的功能的异常将是无害的。例如,如果您使用RAII(通常推荐的方法)自动释放互斥锁,您可以获得原子操作的一半(从银行账户1中提取的钱),抛出异常,并使系统处于不适当的状态(不是钱)但已存入银行账户2)。

somewhat classic ScopeGuard article有其他信息。

答案 2 :(得分:0)

首先,您链接到的内存泄漏问题与异常处理本身无关,只是不能处理您想要运行的某些代码可能被绕过的所有方式。它同样适用于returnexit()breakif绕过一些清理代码等等 - 它只是不太明显的例外情况。 RAII是处理这类错误的常用方法(尽管exit()会阻止某些对象的析构函数运行)。

Re例外:

  • 他们可能未被捕获,导致程序终止
  • 他们可能被抓到错误的地方,导致不当处理和可能的意外行为
  • classic boost :: shared_ptr&lt;&gt;错误:f(shared_ptr<int>(new int(2)), g());,其中g()可能会抛出,可能会泄漏内存
  • 异常规范通常名誉扫地