Try/Finally实际上是异常安全的吗?

Meh*_*dad 0 c# java exception-handling exception-safe visual-c++

假设你有一段代码如下:

resource = allocateResource();
try { /* dangerous code here  */ }
finally { free(resource); }
Run Code Online (Sandbox Code Playgroud)

我在这里没有提到任何特定的语言,但我猜Java,C#和C++就是很好的例子(假设你在MSVC++中使用__try/ __finally).

这个例外安全吗?

就个人而言,我不认为这是异常安全的,因为如果进入try之前有异常怎么办?那你的资源就会泄漏.

不过,我已经看过很多次了,我觉得我错过了什么......是吗?或者这真的不安全吗?


编辑:

不是要求allocateResource抛出异常,而是该函数返回之后但 resource分配之前得到异常的情况.

Dav*_*nan 6

我不是在询问allocateResource是否会抛出异常,而是在该函数返回之后但在分配资源之前得到异常的情况.

尝试处理异常安全的这一方面变得非常麻烦,尤其是因为语言结构不允许您在赋值语句的中间安装finally处理程序.

我所有这一切的基本原理是,如果你无法从函数调用的末尾获得分配给变量,那么你的系统就已经被软化了.当你无法分配变量时,谁在乎你的内存是否泄漏?

  • 当然,编辑后回答是有益的! (2认同)