《Effective C++》读书笔记 资源管理
C++程序中最常用的资源包括动态分配的内存,文件描述器,互斥锁,数据库连接,网络socket等等。不论哪种资源,重要的是,当你不再使用他时,必须将他归还给系统。
一个很好的做法是以对象管理资源。把资源放进对象内,我们便可依赖C++的析构函数自动调用机制确保资源被释放,这样便不会发生资源泄露的问题。一个实现的方法是,以智能指针封装资源,由于atuo_ptr缺陷太多,已经基本被废弃,建议使用shared_ptr。下面看一个使用shared_ptr的具体实现
-
void f()
-
{
-
shared_ptr<Investment> pInv(createInvestment());//工厂函数返回的对象初始化资源,再用shared_ptr封装他
-
}
shared_ptr的一个特性是其提供了引用计数,每当其管理对象被指向便会+1,在无人指向它时自动删除该资源,并且支持copy操作。因为可以很方便的通过它进行内存管理,不用担心资源泄露。
在资源管理类中小心copying行为
一般情况下,对资源的复制行为是不会允许的,比如互斥锁,你不会想要把一个互斥器对象复制的,对吧?所以如果你的资源对象不适合被复制,你应该禁止复制这种行为:把copying操作声明为private,然后继承它,就像下面这样
-
class Lock:private Uncopyable
-
{
-
...
-
};
或者如果你确实有需求复制资源,例如你非得复制互斥器,那就使用前面介绍的shared_ptr吧,但是shared_ptr有一个不幸的特性,当引用次数为0时删除其所指物,不过类似于C++标准库里的其他部件,shared_ptr允许你定制自己的删除器,shared_ptr有一个重载类型接受第二个参数。
-
Class Lock
-
{
-
public:
-
explicit Lock(Mutex* pm):mutexPtr(pm,unlock)//第二个参数指定引用计数为0时的行为,即是unlock
-
{
-
lock(mutexPtr.get());//mutexPtr.get()返回mutexPtr管理对象的原生类型
-
}
-
private:
-
shoread_ptr<Mutex> mutexPtr;
-
};
在资源管理类中提供对原始资源的访问也是一个重要的功能。
对于share_ptr,它提供了get()成员函数,用来执行显式转换,返回智能指针内部的原始指针
对与我们自定义资源管理类,有两种方式提供对原始资源的访问:显式转换函数和隐式转换函数
-
//假设我们有这样一个类
-
class Font
-
{
-
public:
-
explicit Font(FontHandle fg):f(fh){}
-
private:
-
FontHandle f;
-
};
其显式转换函数形式为
FontHanld get() const { return f; }
其隐式转换函数形式为
operateor FontHandle() const { return f; }
这两种形式各有好处,隐式转换的好处是比较自然,但是会增加错误发生机会,例如我们本想得到一个Font,结果却意外得到FontHandle
-
Font f1(getFont());
-
FontHandle f2=f1;//这里会将Font转型为FontHandle,假如这不是你想要的呢?这个错误很隐蔽
在使用智能指针时会发生一个问题,如果有一个函数是以下形式:
process( shared_ptr<Investment> (new Investment),priority );
这条语句有三个动作:
调用unlock,执行new Investment,调用shared_ptr构造函数。我们知道,new Investment动作一定在shared_ptr构造函数之前,另外C++对构造函数内动作的次序是无定义的,如果unlock动作发生在第二顺位,并且如果它的调用导致异常,此时new Investment返回的指针会遗失,引发资源泄露。对此,解决方法是先建立好智能指针。
-
shared_ptr<Investment> p(new Investment);
-
process(p,priority);
总结起来便是,以独立语句将newed对象置入智能指针。
《Effective C++》读书笔记 资源管理的更多相关文章
- Effective STL 读书笔记
Effective STL 读书笔记 标签(空格分隔): 未分类 慎重选择容器类型 标准STL序列容器: vector.string.deque和list(双向列表). 标准STL管理容器: set. ...
- Effective STL读书笔记
Effective STL 读书笔记 本篇文字用于总结在阅读<Effective STL>时的笔记心得,只记录书上描写的,但自己尚未熟练掌握的知识点,不记录通用.常识类的知识点. STL按 ...
- effective c++读书笔记(一)
很早之前就听过这本书,找工作之前读一读.看了几页,个人感觉实在是生涩难懂,非常不符合中国人的思维方式.之前也有博主做过笔记,我来补充一些自己的理解. 我看有人记了笔记,还不错:http://www.3 ...
- Effective Java读书笔记完结啦
Effective Java是一本经典的书, 很实用的Java进阶读物, 提供了各个方面的best practices. 最近终于做完了Effective Java的读书笔记, 发布出来与大家共享. ...
- Effective java读书笔记
2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己 计在16年要看12本书,主要涉及java基础.Spring研究.java并发.J ...
- Effective C++读书笔记(转)
第一部分 让自己习惯C++ 条款01:视C++为一个语言联邦 一.要点 ■ c++高效编程守则视状况而变化,取决于你使用c++的哪一部分. 二.扩展 将c++视为一个由相关语言组成的联邦而非单一语言会 ...
- Effective Objective-C 读书笔记
一本不错的书,给出了52条建议来优化程序的性能,对初学者有不错的指导作用,但是对高级阶段的程序员可能帮助不是很大.这里贴出部分笔记: 第2条: 使用#improt导入头文件会把头文件的内容全部暴露到目 ...
- Effective C++ 读书笔记(13-32)
条款一十三:以对象管理资源 1.把资源放进对象内,我们便可依赖C++的“析构函数自动调用机制“确保资源被释放. 2.auto_ptr是个”类指针对象“,也就是所谓”智能指针“,其析构函数自动对其所指对 ...
- 【Effective C++读书笔记】序
C++ 是一个难学易用的语言! [C++为什么难学?] C++的难学,不仅在其广博的语法,以及语法背后的语义,以及语义背后的深层思维,以及深层思维背后的对象模型: C++的难学还在于它提供了四种不同而 ...
随机推荐
- Gradle Goodness: Working with Live Task Collection
Gradle support the definition of so called live collections. These collections are mostly created ba ...
- Python 学习笔记(十)Python集合(三)
集合运算 元素与集合的关系 元素与集合的关系 ,就是判断某个元素是否是集合的一员."a" in aset >>> s =set([1,2,3,4]) >&g ...
- linux配置mysq与navicat关联
第一步:在linux中安装mysql(执行如下语句) 安装 mysql: yum install mysql yum install mysql-server yum install mysql-de ...
- 动态树LCT(Link-cut-tree)总结+模板题+各种题目
一.理解LCT的工作原理 先看一道例题: 让你维护一棵给定的树,需要支持下面两种操作: Change x val: 令x点的点权变为val Query x y: 计算x,y之间的唯一的最短路径的点 ...
- 颜色rgba、16进制、10进制互相装换
rgba转16进制: function RGBToHex(rgb){ var regexp = /[0-9]{0,3}/g; var re = rgb.match(regexp);//利用正则表达式去 ...
- redis集群部署步骤
1.yum 安装依赖 yum install gcc unzip wget 2.编译安装redis,编译安装的目的是源码包内包含了接下来创建redis集群所需要的 redis-trib.rb脚本 ma ...
- laravel4.2 Redis 使用
laravel4.2 Redis 使用 配置文件,app/config/database.php 'redis' => array( 'cluster' => false, 'defaul ...
- Python学习手册之 Python 之禅、Python 编程规范和函数参数
在上一篇文章中,我们介绍了 Python 的正则表达式使用示例,现在我们介绍 Python 之禅. Python 编程规范和函数参数.查看上一篇文章请点击:https://www.cnblogs.co ...
- 解决ssh连接中断程序终止的问题——tmux
参考:http://www.cnblogs.com/kevingrace/p/6496899.html ssh连接有时候会异常中断,重连后原本运行的程序会中断,要解决这个问题,我们可以使用Linux终 ...
- 北京Uber优步司机奖励政策(9月21日~9月27日)
用户组:优步北京人民优步A组(适用于9月21日-9月27日) 滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不 ...