RAII(Resource Acquisition Is Initialization资源获取即初始化 )思想

一、定义
    RAII,Resouce Acquisition Is Initialization,翻译成中文的意思就是资源获取即初始化,RAII主要用于保证申请的资源得到正确的释放。最初由 Bjarne Stroustrup提出,为了保证资源能够正确的得到释放,RAII原则是所有的资源都必须有管理对象,而资源的申请操作在管理对象的构造函数中进行,而资源的回收则在管理对象的析构函数中进行。由于C++标准保证所有对象在离开作用域时,析构函数都会被调用,因此即使在资源的使用过程中发生了异常,也能够保证资源得到释放。

二、标准C++中RAII
    在标准C++中,有很多地方都遵守了RAII原则,比如ifstream和ofstream。当我们使用按如下使用文件时:
    {
        ifstream fin("test.txt", ios::in);
        ...    //do some work
    }
    在fin离开其作用域时,在它的析构函数中会调用fin的close方法,以关闭打开的文件句柄,这里文件句柄的获取即是ifstream对象的初始化,ifstream也就成为了文件句柄的管理类,在它的构造函数中会负责句柄的回收 。假如此处使用的是FILE*,而且在离开作用域之前没有主动关闭文件句柄,或者是在关闭之前发生了异常,则文件句柄得不到释放。
    除此以外还有智能指针,如unique_ptr,shared_ptr等,它们是典型的RAII原则。它们负责对创建于堆内存的对象进行管理,在析构函数中会负责对象所占内存的回收。如果是unique_ptr,在析构函数中会直接调用delete来回收对象内存;而shared_ptr则在析构函数中,先减引用计数,如果引用计数值为0,则调用delete回收内存,否则不做其他操作。

三、遵守RAII的建议
    关于RAII具体有以下几条建议:
  1. 使用智能指针代替原始指针;
  2. 不直接使用mutex对象,使用guard_lock或scoped_lock替代;
  3. 对于需要回收的资源,如果没有现成的类可用,则自己封装一个管理类,在构造函数中申请资源,并析构函数中回收资源;
    

你可能感兴趣的:(C++)