介绍
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
待补充