RAII:Reource Acquisition Is Initializetion(资源获取即初始化),是利用C++类对象的生命周期管理资源的一种方式(包括:分配的堆内存、线程资源、socket、打开的文件、锁、磁盘空间、数据库连接等)。这种技术的另一个名称是SBRM(作用域绑定资源管理),RAII对象的生命周期由于作用域退出而结束。
RAII可以总结如下:
- 将每个资源封装到一个类中
- 构造函数获取资源并创建类的所有变量,若不能完成则抛出异常
- 析构函数释放资源同时不能抛出异常
- 始终通过RAII类的实例使用资源,要么
- 它有自动存储周期或零时生命周期,或者
- 生命周期绑定到了一个自动变量或临时变量
最常见的RAII使用例子,自动释放mutex:
// CLASS TEMPLATE lock_guard
template <class _Mutex>
class lock_guard { // class with destructor that unlocks a mutex
public:
using mutex_type = _Mutex;
// 构造函数获取资源初始化
explicit lock_guard(_Mutex& _Mtx) : _MyMutex(_Mtx) { // construct and lock
// 加锁
_MyMutex.lock();
}
lock_guard(_Mutex& _Mtx, adopt_lock_t) : _MyMutex(_Mtx) { // construct but don't lock
}
// 析构函数解锁释放资源
~lock_guard() noexcept {
_MyMutex.unlock();
}
lock_guard(const lock_guard&) = delete;
lock_guard& operator=(const lock_guard&) = delete;
private:
_Mutex& _MyMutex;
};