首先假设对于一个mutex互斥器对象,有lock以及unlock两个函数可用:

 void lock(Mutex * pm);
void unlock(Mutex * pm);

那么为了防止资源忘记被释放,首先得想法就是创建一个RAII类来进行资源的管理,像下面这样:

 class Lock{
explicit Lock(Mutex * mutex)
:mtx(mutex){}
~Lock(){unlock(mtx)}
private:
Mutex * mtx;
};

然后再用户想要使用的时候就应该这样的使用:

 func(mutex mtx)
...
{
Lock m1(&mtx);
}
...
这样是可以得,但这里应该注意的一点就是应该阻止用户无疑的对RAII类的coping行为,这个行为在这里不是我们想要的,那么可以做的基本上就是下面这几点
1. 禁止复制:当复制确实不合理的时候就这样做
2. 同样的,对这个RAII类的底层资源也去采用引用计数法:这里就是mtx对象了。可以将它变成shared_ptr成员。
 private:
shared_ptr<Mutex> pMtx;
大概就是上面这样,但是这里shared_ptr的删除含义可能不是我们想要的,我们想要在shared_ptr对象析构的时候不是去删除资源,而是去释放对mutex的占用权。
这你就要用到shared_ptr可以自定义的删除器了,删除器在构造的时候直接可以直接的指定。
 class Lock{
public:
explicit(Mutex * pm)
:pMutex(pm, unlock)
{lock(pMutex.get());}//这里的get要引起注意啊
private:
shared_ptr<Mutex> pMutex;
};
3.复制底部的资源,就像一般一开始创造自己的string对象做的一样,复制pstring所指向的资源。
4.转移底部资源的拥有权:这个就是auto_ptr所要做的事了,和它的意义正好的相符合的。
小结:
1.复制一个RAII对象就应该一并复制器所管理的资源,所以说资源的coping行为就决定了RAII对象的coping行为(就像上面这个例子中mutex的copy行为决定了他对应的RAII不应该接受拷贝)
2.常见的RAII对象的coping行为是:抑制coping, 使用引用计数法。
 
小结:
1. APIs一般都要求提供原始资源,所以一般每一个RAII class都应该提供 取得所管理的资源 的方法!
2. 显示转换一般要比隐式转换更好一点,虽然后者较为方便

条款14:在资源管理类中小型coping的行为的更多相关文章

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

    复制RAII对象必须一并复制它所管理的资源,所以资源的copying行为决定RAII对象的copying行为. 普遍而常见的RAII class copying行为是:抑制copying(使用私有继承 ...

  2. Effective C++(14) 在资源管理类中小心copying行为

    问题聚焦:     上一条款所告诉我们的智能指针,只适合与在堆中的资源,而并非所有资源都是在堆中的.     这时候,我们可能需要建立自己的资源管理类,那么建立自己的资源管理类时,需要注意什么呢?. ...

  3. 读书笔记 effective c++ Item 14 对资源管理类的拷贝行为要谨慎

    1. 自己实现一个资源管理类 Item 13中介绍了 “资源获取之时也是初始化之时(RAII)”的概念,这个概念被当作资源管理类的“脊柱“,也描述了auto_ptr和tr1::shared_ptr是如 ...

  4. effective条款15,在资源管理类中小心copying行为

    class A { private: int *p; void lock(){ cout << p << "is lock" << endl; ...

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

    请牢记: 1.复制RAII对象必须一并复制它所管理的资源,所以资源的copying行为决定RAII对象的copying行为. 2.普遍常见的RAII class copying行为是:抑制copyin ...

  6. Effective C++ 条款13/14 以对象管理资源 || 在资源管理类中小心拷贝行为

    三.资源管理       资源就是一旦你使用了它,将来不用的时候必须归还系统.C++中最常用的资源就是动态内存分配.其实,资源还有 文件描述符.互斥器.图形界面中的字形.画刷.数据库连接.socket ...

  7. Effective C++ 条款15、16 在资源管理类中提供对原始资源的访问||成对使用new 与 delete要采取相同形式

    1.在资源管理类中提供对原始资源的访问     前几个条款很棒,它们是对抗资源泄露的壁垒,但很多APIs直接指向 资源,这个时候,我们需要直接访问原始资源.     这里,有两种方法解决上述问题,我们 ...

  8. EC笔记:第三部分:14、在资源管理类中小心Copying行为

    场景 上一节实现了智能指针,其中的拷贝构造函数和赋值运算符是通过增加/减少指针的引用计数来操作的.但是如果是管理一个独占资源呢?我们希望在一个资源使用时被锁定,在使用完毕后被释放. #include ...

  9. 【14】在资源管理类中小心copying行为

    1.为什么要使用资源管理类? 资源管理类的思路就是,栈上的对象,封装堆上分配的资源,确保一定会释放资源.auto_ptr和shared_ptr就是资源管理类,行为上像指针. 2.auto_ptr和sh ...

随机推荐

  1. CG group

    Linux CGroup全称Linux Control Group, 是Linux内核的一个功能,用来限制,控制与分离一个进程组群的资源(如CPU.内存.磁盘输入输出等).这个项目最早是由Google ...

  2. python16_day02【列表、字典】

    1.列表 names = ['Alex',"Tenglan",'Eric'] >>> names[0] 'Alex' >>> names[2] ...

  3. yum安装mysql5.6

    1.检查系统是否安装其他版本的MYSQL数据 yum list installed | grep mysql yum -y remove mysql-libs.x86_64 2.安装及配置 wget ...

  4. rsync+sersync多线程实时同步

    一.sersync优点 1)使用c++编写,对linux系统文件产生的临时文件和重复文件操作会进行过滤,在结合rsync同步的时候,会减少运行时消耗的本地及网络资源,因此速度更快. 2)相比较inot ...

  5. CodeForces - 786B Legacy (线段树+DIjkstra+思维)

    题意:给N个点和Q条选项,有三种类型的选项:1.从u到v花费w修建一条路:2.从u到下标区间为[L,R]的点花费w修建一条路; 3.从下标区间为[L,R]的点到u花费w修建一条路. 然后求起点s到其余 ...

  6. javascript Date对象 之 设置时间

    之前对js的date对象总是感觉熟悉,而不愿细细深究其所以然,所以每当自己真正应用起来的时候,总会糊里糊涂的,今日花费2个小时的时间仔细钻研了一下,感觉 豁然开朗,故,以此记录,一来 供以后查阅,二来 ...

  7. CSS 控制元素 上下左右居中

    不说废话,直接 搞起..... 首先,我们将题目 <css控制元素上下左右居中> 分析一下哈,我是将其分成了4部分信息: 1.CSS控制: 只用 CSS 来达成目的 2.元素:  不只是d ...

  8. Linux网络性能评估工具iperf 、CHARIOT测试网络吞吐量

    网络性能评估主要是监测网络带宽的使用率,将网络带宽利用最大化是保证网络性能的基础,但是由于网络设计不合理.网络存在安全漏洞等原因,都会导致网络带宽利用率不高.要找到网络带宽利用率不高的原因,就需要对网 ...

  9. Mysql 慢查询日志配置

    查询日志 1.主配置文件下对添加参数.重启生效. vim /etc/my.cnf 注:主要用于查看开发程序执行时间. 注:log_slow_queries = /tmp/mysql.slow    # ...

  10. Nginx 配置文件重写

    nginx主配置文件 1.清空过Nginx配置文件,修改: vim /usr/local/nginx/conf/nginx.conf # 以那个账户,账户组来运行nginx user nobody n ...