天天看点

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

     并非所有的资源都是heap-based,对于这种资源而言,像auto_ptr和tr1::share_ptr这样的智能指针往往不适合作为资源掌管者。这个时候我们需要建立自己的资源管理类。

     基础代码:

//RAII守则

class Lock{

public:

explicit Lock(Mutex* pm):mutexPtr(pm){

lock(mutexPtr);

}

~Lock(){

unLock(mutexPtr);

}

private:

Mutex* mutexPtr;

};

//使用

Mutex m;

...

{

...

Lock ml(&m);//自动锁定mutex

... //区块结束时自动释放mutex

}

问题:如果对象被复制,会发生什么情况?

    Lock m1(&m);

    Lock m2(m1);

解决:1、禁止复制,参见条款6。2、“引用计算法”

class Lock{

public:

explicit Lock(Mutex* pm):mutexPtr(pm,unLock){

lock(mutexPtr_.get()); //条款15谈GET

}

private:

std::tr1::shared_ptr<Mutex > mutexPtr;

};

注意:

1、复制底部资源,复制资源管理对象时,进行深度复制,如字符串对象内含一个指针指向一块HEAP内存。

2、转移底部资源的拥有权。参见条款13.

继续阅读