在条款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、使用引用计数法。