[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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值