Effective C++条款14:在资源管理类中小心copying行为

在条款13中,我们有了“资源获得的时机便是初始化时机”的RAII概念,在实现上,我们很多时候会选择使用auto_ptr和tr1::sharec_ptr指针,但是很多时候我们会发现,这两个指针也不是万能的,很多时候我们应该构建自己的——“资源管理类”。

 

所以,我们会构建出在构造函数中初始化,并在析构函数中自动删除的类。

但是,这样就会有一个问题,面对拷贝构造,我们应该怎么办呢?

面对这样的情况,我们应当有以下方法:

1、禁止复制!

很多时候,允许复制是很不合理的一种行为,所以我们可以通过将拷贝构造函数声明为private,来禁止拷贝操作。(具体可以看条款6)

2、对底层资源使用“引用计数法”

有时候,我们希望保有资源直到最后一个使用者被销毁,在这种情况下复制RAII对象时,应该将资源的“被引用数”递增。

class Lock
{
    public:
        explicit Lock(Mutex* pm):mutexPtr(pm,unlock)
        {
            lock(mutexPtr.get());
        }
    private:
        std::tr1::shared_ptr<Mutex> mutexPtr;
}

3、复制底部资源

这里方法是让我们进行“深拷贝”。将底层的所有资源都拷贝给新的对象即可。

4、转移底部资源的拥有权

实则是使用了auto_ptr的思想,在复制时,直接将资源转移给目标对象。

 

需要记住的点:

1、复制RAII对象必须一并复制它所管理的资源,所以资源的copying行为决定RAII对象的copying行为

2、普遍而常见的RAII对象拷贝行为是:抑制copying、使用引用计数法。

上一篇:Python - 装机系列66 pandas读取excel的问题


下一篇:一维卷积的matlab实现