欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[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