c++ - 资源获取即初始化 (RAII) 是什么意思?

标签 c++ raii

Resource Acquisition is Initialization (RAII) 是什么意思?

最佳答案

对于一个非常强大的概念来说,这是一个非常糟糕的名字,也许是 C++ 开发人员在切换到其他语言时最想念的第一件事。尝试将这个概念重命名为 Scope-Bound Resource Management 的运动已经发生了一些变化,尽管它似乎还没有流行起来。

当我们说“资源”时,我们不仅仅指内存——它可以是文件句柄、网络套接字、数据库句柄、GDI 对象……简而言之,我们的资源有限,因此我们需要能够控制它们的使用。 “范围绑定(bind)”方面意味着对象的生命周期绑定(bind)到变量的范围,因此当变量超出范围时,析构函数将释放资源。一个非常有用的特性是它可以提高异常安全性。例如,比较一下:

RawResourceHandle* handle=createNewResource();
handle->performInvalidOperation();  // Oops, throws exception
...
deleteResource(handle); // oh dear, never gets called so the resource leaks

使用 RAII 一个

class ManagedResourceHandle {
public:
   ManagedResourceHandle(RawResourceHandle* rawHandle_) : rawHandle(rawHandle_) {};
   ~ManagedResourceHandle() {delete rawHandle; }
   ... // omitted operator*, etc
private:
   RawResourceHandle* rawHandle;
};

ManagedResourceHandle handle(createNewResource());
handle->performInvalidOperation();

在后一种情况下,当抛出异常并展开堆栈时,局部变量会被销毁,从而确保我们的资源被清理并且不会泄漏。

关于c++ - 资源获取即初始化 (RAII) 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2321511/

相关文章:

c++ - 如何提供对包装类的 const 只读访问

具有模板和多态性的 C++ 序列化器

c++ - 使用 FMOD 将输出保存到磁盘

c# - 使用 IDisposable 和 "using"作为获取 "scoped behavior"以实现异常安全的手段是否滥用?

c# - 如何解锁锁定括号内的线程

c++ - HLSL 缓冲区步幅和线程 - 这里发生了什么?

c++ - 在 C++11(或更新版本)中创建 RAII 包装器而无需编写新类的最短路径是什么?

c++ - 如何设置带有 RAII 类的标准容器?

c++ - 如何在函数导出上运行清理代码?

java - Java 中的 RAII... 资源处理总是那么难看吗?