RAIL风格

RAII是指C++语言中的一个惯用法(idiom),它是“Resource Acquisition Is Initialization”的首字母缩写。中文可将其翻译为“资源获取就是初始化”。虽然从某种程度上说这个名称并没有体现出该惯性法的本质精神,但是作为标准C++资源管理的关键技术,RAII早已在C++社群中深入人心。
因为系统的中的资源不是无限的,因此、通常没有使用RAIL风格的使用方式是
- 获取资源
- 使用资源
- 释放资源
如:
void fileHandler() {
FILE * f = fopen("test.txt", "rw");
someFunction();
fclose(f);
}
但是资源过多的时候就会出现漏释放的情况导致资源泄露,RAIL的使用方式在C++中随处可见,比如标准库中的lock_guard<std::mutex>的实现。
因为,锁的特殊性。锁的申请没有放到lock_guard中实现,但是锁的加锁和锁的释放是采用了RAIL的模式。
/** @brief A simple scoped lock type.
*
* A lock_guard controls mutex ownership within a scope, releasing
* ownership in the destructor.
*/
template<typename _Mutex>
class lock_guard
{
public:
typedef _Mutex mutex_type;
// 在构造函数中加锁
explicit lock_guard(mutex_type& __m) : _M_device(__m)
{ _M_device.lock(); }
lock_guard(mutex_type& __m, adopt_lock_t) noexcept : _M_device(__m)
{ } // calling thread owns mutex
// 析构函数中释放锁
~lock_guard()
{ _M_device.unlock(); }
// 拒绝隐式转换
lock_guard(const lock_guard&) = delete;
lock_guard& operator=(const lock_guard&) = delete;
private:
mutex_type& _M_device;
};
关注公众号,一起学习C/C++/go的最新技术

2166

被折叠的 条评论
为什么被折叠?



