[Effective C++] Rules 13: Use objects to manage resources
程序员文章站
2024-02-29 08:46:28
...
除去class、template等,C与C++明显不同的一点就是对于资源的管理方式。
C++也支持传统C语言那种风格的手动资源资源管理方式。
但是,很明显这种原始方式对于C++而言,有些力不从心。
下面是比较典型的C-like资源管理方式,但是,如果在资源获取和释放之间发生了exception会怎么样?
很明显,资源释放操作就可能被跳过。
你可能会说,我们可以catch exception再进行处理,但是这个真的很麻烦。
allocate resources like memory
...
free resources
为了解决以上这些头痛的问题,C++所采取的方式就是“RAII”。
RAII: Resource Acquisition Is Initialization 资源获取即初始化
* 获得资源后立刻交由某对象进行保存;
* 当控制流无论因为何种原因离开{ .. }时,对象的析构函数被自动调用,进而调用资源的析构函数;
在C++11中,这主要体现在shared_ptr等各种智能指针身上。
它们在构造函数阶段获得被管理的资源,在析构函数阶段负责释放被管理的资源。
{
weak_ptr<int> pi(new int(42));
...
}
而对于像是互斥锁mutex这类资源,我们可能需要手动给出资源管理类。
class MLock {
public:
explicit MLock(pthread_mutex_t *ml) : mlock(ml) { pthread_mutex_lock(mlock); }
~MLock() { pthread_mutex_unlock(mlock); }
private:
pthread_mutex_t *mlock;
};
...
pthread_mutex_t m;
{ // critical section
MLock ml(&m); // entering critical section
...
} // leaving