C++ RAII


RAII, Resource Acquisition Is Initialization

参考:

https://stackoverflow.com/questions/2321511/what-is-meant-by-resource-acquisition-is-initialization-raii

RAII的意思是资源获取就是类的初始化。

是一种管理资源的方式,资源可以是内存,也可以是文件、网络、数据库等等。

资源的管理有一个问题,就是如何正确地释放资源。

利用C++的类初始化和析构,来管理资源。

让资源在对象析构的时候,正确地释放。

获取资源的时候,可以通过初始化,获得资源。

比如,用下面C语言的方式管理资源,可能会导致资源泄露

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代码一样,发生资源泄露了。

cpp