答案 0 :(得分:4)
实际上,如果抛出一个意外的异常,任何算法都会中断。
例如,算法需要按顺序执行两个操作,第二个操作会导致异常 - 第一个不会被取消(除非你处理这个)并且程序现在处于不一致状态。在这种情况下,您链接到不一致表现为内存泄漏 - 代码意图解除分配内存,但由于异常而未运行解除分配代码。
解决方案是期望例外并使用RAII来管理资源和状态一致性。例如,如果需要执行两个操作,首先在堆栈上创建“括号类”实例,在第二个操作完成后,在该实例上运行一个特殊方法,这意味着两个操作都已成功运行。如果抛出异常,该类的析构函数将回滚第一个动作。
答案 1 :(得分:2)
Bjarne Stroustrup已经提供the chapter on exception safety( The C ++ Programming Language,3rd ed 。)。
此外,您必须确保在呼叫中途中断您的功能的异常将是无害的。例如,如果您使用RAII(通常推荐的方法)自动释放互斥锁,您可以获得原子操作的一半(从银行账户1中提取的钱),抛出异常,并使系统处于不适当的状态(不是钱)但已存入银行账户2)。
答案 2 :(得分:0)
首先,您链接到的内存泄漏问题与异常处理本身无关,只是不能处理您想要运行的某些代码可能被绕过的所有方式。它同样适用于return
,exit()
,break
或if
绕过一些清理代码等等 - 它只是不太明显的例外情况。 RAII是处理这类错误的常用方法(尽管exit()
会阻止某些对象的析构函数运行)。
Re例外:
f(shared_ptr<int>(new int(2)), g());
,其中g()可能会抛出,可能会泄漏内存