改善程序与设计的55个具体做法 day6
条款13:以对象管理资源
资源,包括但不限于内存、句柄、GDI对象、数据库连接等。
内存要记得释放,句柄要记得closehandle, GDI对象要记得删除,数据库连接要记得关闭,等等等等。
以对象来管理这些资源就是利用 对象的构造和析构 特性,在构造函数中获得资源并在析构函数中释放资源。
两个智能指针auto_ptr 和 std::tr1::shared_ptr,前者同一时刻只能指向同一个资源,赋值的一方不再指向这个资源,被赋值的一方指向这个资源。在析构函数中对对象调用delete(而不是delete[])。
shared_ptr利用引用计数,多个指针可以指向同一个对象,当引用技术为0时,对对象调用delete(而不是delete[])。
条款14:在资源管理类中小心copying行为
这个比较好理解,管理资源的对象的copying行为(拷贝构造 和 operator=)一定要谨慎
a 必要的时候可以不允许其对外界有copying行为
b 对其管理的底层资源使用饮用计数机制(比如 shared_ptr)
c 复制其管理的底部资源(深拷贝)
d 转移其惯例的底部资源的拥有权(比如 auto_ptr)
条款15:在资源管理类中提供对原始资源的访问
原始资源 也就是上一条款中提到的 底部资源。
a 显式转换
Pointer Get() const; 提供get函数
b 隐式转换
operator 类型(){return m_ptr; } 提供类型转换函数
条款16:成对使用new 和 delete 时要采取相同形式
即 new - delete, new [] - delete[]
这样做到原因是new[] 会在内存中记录个数,当delete[]的时候会去这(几)个内存单元读取该个数,然后按照该个数去释放(析构)内存。
如果是 new [] - delete,则可能会造成资源泄漏, 如果是 new - delete[] 则可能会导致未定义的问题。
条款17:以独立语句将newed 对象置于智能指针
这句话乍读有点绕口,其实代码写出来很简单。
e.g.
void Func(std::tr1::shared_ptr<CObject> ptr, int a)
调用时, Func(std::tr1::shared_ptr<CObject>(new CObject), GetA()), 由于参数的调用顺序和编译器的优化问题,可能会产生如下顺序的(伪)代码:
new CObject;
GetA();
std::tr1::shared_ptr<CObject>(指针)
当GetA的调用产生异常时,可能导致执行不到第三行,这样CObject对象就不会被释放了,从而造成内存泄漏。
所以本条款要说的是:
std::tr1::shared_ptr<CObject> ptr(new CObject);
Func(ptr, GetA);
改善程序与设计的55个具体做法 day6的更多相关文章
- 改善程序与设计的55个具体做法 day9
条款23:宁以non-member.non-friend替换member函数 即 以非成员函数 非友元函数 替换成员函数. 直观上,面向对象应该尽可能的封装,封装数据.封装操作等等,所以这个条款可能有 ...
- 改善程序与设计的55个具体做法 day7
条款18:让接口容易被正确使用,不易被误用 这里说的接口是广义上的接口,即包括但不限于函数接口.类接口.template接口等,每一种接口都是客户与你的代码进行交互的手段. 我们对客户的所谓“资质或水 ...
- 改善程序与设计的55个具体做法 day3
条款07:为多态基类声明virtual析构函数 任何一本C++语法教材上都会讲这一点(如果没讲,扔掉它),这么做到原因是可以让delete pBase操作能够正确的执行子类的析构函数. 需要说明的是当 ...
- 改善程序与设计的55个具体做法 day8
条款20:宁以pass-by-reference-to-const 替换 pass-by-value 即 以const引用 替换值传递. 采用引用传递参数时,底层往往是用指针方式实现,因此参数传递内置 ...
- 改善程序与设计的55个具体做法 day5
条款12:复制对象时勿忘其每一个成分 这里的复制是拷贝构造和operator= 每一个成分有几个维度: 1.每个成员变量 这个很好理解,添加新的成员时也要记得为每个新添加的成员执行合适的复制操作 2. ...
- 改善程序与设计的55个具体做法 day4
今天晚上回到小区门口,买了点冬枣,要结账的时候想起来,钥匙没带,落公司了! TNND,没办法再回趟公司,拿了钥匙,来回一个小时,汗~ 条款10:令operator=返回一个reference to * ...
- 改善程序与设计的55个具体做法 day2
条款05:了解C++默默编写并调用哪些函数 如果没有为类定义构造函数.析构函数.拷贝构造函数.重载赋值操作符,并且这些函数被需要(调用)时,编译器会为类生成默认的函数,而这些函数是public inl ...
- 改善程序与设计的55个具体做法 day1
博客好久没更新了,就从这本读书笔记开始吧. 条款01: 视C++为一个语言联邦 C++可视为有四个次语言组成的: 1.C语言 2.Object-Oriented C++ (面向对象C++) 3.Tem ...
- 重构HTML改善web应用设计
本文从良构,有效性,布局三个角度,结合往日项目开发经历, 整理总结重构HTML改善Web应用设计的几点规则和做法.部分参考自<重构HTML改善Web应用设计>. 重构.什么是重构?为什么要 ...
随机推荐
- mybatis like写法
name like concat(concat('%',#{name}),'%') name like concat('%',#{name},'%')
- debounce 防抖动函数
http://lodash.think2011.net/debounce _.debounce(func, [wait=0], [options]) 创建一个防抖动函数. 该函数会在 wait 毫秒后 ...
- Unable to connect to a repository at URL 解决方法
提示"Unable to connect to a repository at URL 'svn://localhost/project1/'" or “Can't connect ...
- Swing中GridBagLayout布局的使用
1 http://pydoing.blogspot.com/2011/05/java-gridbaglayout.html 台湾人博客,需FQ 2 http://zhangjunhd.blog.51 ...
- 让 webpack 加载 Source Map
在浏览器中运行的 JavaScript 代码都是编译器输出的代码,这些代码的可读性很差.如果在开发过程中遇到一个不知道原因的 Bug,则你可能需要通过断点调试去找出问题. 在编译器输出的代码上进行断点 ...
- 自动化测试 python2.7 与 selenium 2 学习
windows环境搭建 # 下载 python[python 开发环境] http://python.org/getit/ # 下载 setuptools [python 的基础包工具]setupto ...
- Codeforces 34C-Page Numbers(set+vector+暴力乱搞)
C. Page Numbers time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- JavaScript_DOM编程艺术第二版[阅]
前两年迫于项目的需要,只是拿来JQuery用到项目中,并没有实质上理解javascript(貌似其他人也是这么干的)~ 随着最近几年,得益于Nodejs, React, Vue等,javascript ...
- Trie树学习
这几天在看Hadoop的排序,用到了有TotalSortPartition,其中用到了一种叫做trie树的数据结构,每次看到这种自己之前没有听过的数据结构就想去看一下原理,然后再网上看几篇博客,有时间 ...
- args *args **kwargs区别
python 函数中的参数类型有两种,分别为 位置参数和关键字参数: 一 .位置参数(该类参数位置固定不变) args: 表示默认位置参数,该参数是具象的,有多少个参数就传递多少参数,且参数位 ...