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/