改善程序与设计的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应用设计>. 重构.什么是重构?为什么要 ...
随机推荐
- CentOS——yum命令运行错误解决办法
问题: [root@name user]# yum File "/usr/bin/yum", line 30 except KeyboardInterrupt, e: ...
- Python3的bytes/str之别
Python 3最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分.文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示.Python 3不会以任意隐式的方式混用str ...
- html中插入php的方法
.html文件是不可以被读取为php文件的必须修改后缀名为.php这个时候如果你在浏览器中调用此页面所有的HTML代码都会被正确显示 这个时候你可以在文件的任意为止插入<?php ?>作为 ...
- jQuery异步框架探究2:jQuery.Deferred方法
(本文针对jQuery1.6.1版本号)关于Deferred函数的描写叙述中有一个词是fledged,意为"羽翼丰满的",说明jQuery.Deferred函数应用应该更成熟. 这 ...
- 【BIEE】01_下载安装BIEE(Business Intelligence)11g 11.1.1.9.0
环境准备 安装文件 如果操作系统是64位,则下载64位版本,我安装的系统是64位的 1.下载所有安装文件 1.1 Oracle Database 11g R2 下载地址: http://www.ora ...
- 使用浏览器地址栏调用CXF Webservice的写法
/* * 通过url调用 * http://localhost:8080/EFP/webService/TestWebservice/testOut/arg0/liuyx */ http://loca ...
- mysql 杀掉(kill) lock进程脚本
杀掉lock进程最快的方法是重启mysql,像你这种情况,1000多sql锁住了,最好是重启如果不允许重启,我提供一个shell脚本,生成 kill id命令杀掉lock线程,如下:--------- ...
- 基于webmagic的种子网站爬取
代码地址如下:http://www.demodashi.com/demo/12175.html 1. 概述 因为无聊,闲来没事做,故突发奇想,爬个种子,顺便学习爬虫.本文将介绍使用Spring/Myb ...
- UITextView被键盘遮挡的处理
这个应该是一个通用的任务了吧,键盘弹出来的时候,UITextView(或者UITextField)会被遮挡. 解决的办法就不是很能通用了. 1. 如果有UIScrollView做父view的话只需要滚 ...
- 腾讯云DevOps 解决方案
地址:https://www.qcloud.com/solution/devops 主要经历的几个阶段: 代码托管 持续集成与交互 测试管理 运维监控 项目管理 在上面图中都有,可以回过去查看.