#include<iostream>
#include<memory>
using namespace std;
class Mutex{
};
void lock(Mutex*pm){
cout << "locked " << endl;
}
void unlock(Mutex*pm){
cout << "unlocked" << endl;
}
class Lock{
public:
explicit Lock(Mutex*pm) :mutexPtr(pm){
lock(mutexPtr);
}
~Lock(){
unlock(mutexPtr);
}
private:
Mutex *mutexPtr;
};
//---------------------禁止复制
class Uncopyable{
protected:
Uncopyable(){}//允许子类对象构造析构
~Uncopyable(){}
private:
Uncopyable(const Uncopyable&);//阻止
Uncopyable&operator=(const Uncopyable&);
};
class Lock1 :private Uncopyable{
public:
explicit Lock1(Mutex*pm) :mutexPtr(pm){
lock(mutexPtr);
}
~Lock1(){
unlock(mutexPtr);
}
private:
Mutex *mutexPtr;
};
//-----------------引用计数法
class Lock2{
public:
explicit Lock2(Mutex*pm) :mutexPtr(pm,unlock){
lock(mutexPtr.get());
}
//不需要析构 mutexPrt的析构函数会在互斥器的引用次数为0时自动调用shared_ptr的删除器 (unlock)
private:
shared_ptr<Mutex>mutexPtr;
};
void test(Mutex &m){
//-------------引用计数法
Lock2 m5(&m);
Lock2 m6(m5);
}
int main(){
Mutex m;
//..
/*{
Lock ml(&m);
}//右括号执行完毕自动解锁 but
Lock ml1(&m);
Lock ml2(ml1);//出现了两把锁
//--------------禁止复制
Lock1 m3(&m);
//Lock1 m4(m3);用不了了
//-------------引用计数法
Lock2 m5(&m);
Lock2 m6(m5);*/
test(m);
//复制资源管理对象时 要进行深拷贝
// auto_ptr可以保证 只有一个RAII对象指向一个未加工资源
system("pause");
return 0;
}
条款14 在资源管理类中小心coping 行为
最新推荐文章于 2020-09-14 09:22:46 发布