您的位置:首页 > 编程语言 > C语言/C++

effective c++ 在资源管理类中小心copying 行为

2015-10-24 20:05 316 查看
资源取得时机便是初始化时机

class Mutex{};
void lock(Mutex* p){}
void unlock(Mutex* p){}
class Lock
{
public:
explicit Lock(Mutex *p)
:mutexPtr(p)
{
lock(mutexPtr);
}
~Lock()
{
unlock(mutexPtr);
}
private:
Mutex *mutexPtr;
};


为确保不会忘记解锁Mutex互斥对象,可能会设计一个class来管理

用户对Lock的用法:

Mutex m;
{
Lock m1(&m);//锁定互斥锁
}                         //在区块最末尾,自动接触互斥锁锁定


Lock m1(&m);
Lock m2(m1);


如果试图复制Lock对象怎么办?!

1.禁止复制,通过声明private拷贝构造函数或者私有继承自己定义Uncopyable类

2.对底层资源祭出“引用计数法”

比如shared_ptr

并且将缺省行为“当引用次数为0时删除所指物”改成解锁

(shared_ptr允许制定所谓的“删除器”)

class Mutex{};
void lock(Mutex* p){cout << "lock" << endl;}
void unlock(Mutex* p){cout << "unlock" << endl;}
class Lock
{
public:
explicit Lock(Mutex *p)
:mutexPtr(p,unlock)
{
lock(mutexPtr.get());
//返回Mutex类型的指针
}
private:
shared_ptr<Mutex>mutexPtr;
};
int main()
{
Mutex m;
{
cout << "---------------------" << endl;
Lock m1(&m);
cout << "---------------------" << endl;
Lock m2(m1);
cout << "---------------------" << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息