RAII

介绍

RAII(Resource Acquisition Is Initialization),资源获取即初始化,C++编程一种手段。很多时候我们需要在一个函数中使用一些资源,这些资源需要在函数结束之后释放,比如文件、socket、锁等等。在不用RAII时,我们一般要在函数return前手动释放这些资源,如果忘记释放会造成内存泄漏,资源一直被占用的问题。RAII能够确保资源在函数中被申请之后,return时自动被释放,这听起来有点像临时变量,没错,这就是和临时变量类似,利用栈空间在函数结束后自动释放的特点进行资源释放。

栗子

/* 不使用RAII*/
std::mutex m;

void bad() {
    m.lock();
    doSomething();
    if(error_happen()) return; // 如果发生错误,在return前没有解锁m,会造成互斥锁m一直被占用
    m.unlock();
}
/* 使用RAII */
std::mutex m;

void good()
{
    std::lock_guard<std::mutex> lk(m);
    doSomething();
    if(!everything_ok()) return; // return时调用了lk的析构函数,释放了互斥锁m,达到了资源自动释放的目的
}                             

RAII的使用可以总结为,将资源封装到类中,通过类的构造函数来获取资源,在析构函数中释放资源。临时资源使用RAII来管理可以确保在资源用完后及时释放。

C++标准库中的RAII

C++标准库中提供了几个RAII封装来管理用户资源:

  • std::unique_ptr和std::share_ptr来管理动态申请的内存以及替代传统指针
  • std::lock_guard,std::unique_lock,std::shared_lock用来管理互斥锁

    std:uniqueptr和std::share_ptr

    待补充

    std::lock_guard/std::unique_lock/std::shared_lock

    待补充