C ++是否可以像Java一样进行资源管理

时间:2009-03-26 18:02:48

标签: java raii resource-management

在C ++中,我们有资源获取初始化(RAII)模式,这极大地简化了资源管理。我们的想法是为任何类型的资源提供一些包装对象。然后,包装对象的析构函数负责在资源超出其范围时释放资源。例如:

{
    auto_ptr<int> smartPointer = new int;
    // some other code

} // the memory allocated for the int is released automatically
  // by smartPointer's destructor

最常见的用法是智能指针。但是,还有许多其他类型的资源(文件,互斥锁,套接字等)可以完全相同的方式进行管理。

在Java中,人们不必打扰内存管理。但所有其他类型的资源仍然存在。有最终块,但它的使用非常不方便,特别是当可以抛出许多不同的异常时。

所以,我的问题是,是否有任何Java模式提供与C ++ RAII等效的功能?如果没有,请分享您在这个领域的最佳实践(而不是最终实践,除非它使用了一些复杂的方法)。

4 个答案:

答案 0 :(得分:11)

您可以使用通常的acquire; try { use; } finally { release; }。或者,您可以使用Execute Around idiom抽象资源处理。

答案 1 :(得分:4)

Joshua Bloch建议在Java中添加一个名为Automatic Resource Management的机制作为Project Coin的一部分(JDK 7的小语言更改):

答案 2 :(得分:3)

答案 3 :(得分:1)

对于许多程序员来说,RAII习语的优势在于底层资源的生命与范围块相关联,使得制作和维护更简单;最终减少因未能释放该资源而导致的错误。

不幸的是,您无法在Java中模仿此行为,因为您无法创建自己的范围绑定结构。尝试解决此问题的类似于Java的语言是C#:

// explicit release
MyClass obj = MyClass();
obj.UseIt();
obj.Dispose();

// RAII-like (scope-bound) release
using(MyClass obj = new MyClass())
{
    obj.UseIt();
}

也许我们将来会看到这样的功能。