[Effective C++] Rules 13: Use objects to manage resources

除去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


猜你喜欢

转载自blog.csdn.net/sai_j/article/details/79463030