c# - Try/Finally 真的是异常安全的吗?

标签 c# java visual-c++ exception exception-safe

假设您有一段代码,例如:

resource = allocateResource();
try { /* dangerous code here  */ }
finally { free(resource); }

我在这里并不是指任何特定的语言,但我想 Java、C# 和 C++ 都是很好的例子(假设您使用的是 __try/__finally在 MSVC++ 中)。

这个异常安全吗?

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

不过,我已经看过很多次了,我认为我错过了一些东西......是吗?还是这真的不安全?

<小时/>

编辑:

不是询问allocateResource抛出异常,而是询问函数返回后出现异常的情况,但分配资源之前。

最佳答案

I'm not asking about allocateResource throwing an exception, but a situation in which you get an exception after that function has returned, but before resource is assigned.

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

我对这一切的理由是,如果你无法从函数调用结束到分配给变量,那么你的系统已经被破坏了。当您无法分配给变量时,谁会关心您是否泄漏内存?

关于c# - Try/Finally 真的是异常安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6234781/

相关文章:

c# - 如何设置带图片的Rectangle的背景?

c# - 如何以编程方式识别 Windows AppFabric 服务是否正在运行?

java - SpringBoot - 解析 HTTP 请求 header 时出错

mysql - C++ Mysql 变量值发送到数据库时发生变化

c++ - 如何测试预处理器符号是否是#define'd但没有值(value)?

c# - 通过ODBC直接向PostGres数据库插入DataTable

java - 如何在Java和C#中获取定义的元素之前和之后的所有元素

java - 音频问题

java - 如何以编程方式设置对齐(右或左)TextView?

c++ - 我可以使用 C++11 智能指针作为 C++ Actor Framework 中的消息返回类型吗?