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