改善程序与设计的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应用设计>. 重构.什么是重构?为什么要 ...
随机推荐
- ubuntu 备份清理tomcat日志,并且删除七天之前的日志
创建文件clear_tomcat_log.sh #!/bin/bash logs_paths[0]="app_tomcat7_8080"; logs_paths[1]=" ...
- 设计模式之十八:桥接模式(Bridge)
桥接模式: 将抽象部分和它的实现部分相分离开来,以使它们能够单独地变化. UML图: 主要包含: Abstraction:定义了抽象部分的接口.操作一个实现部分对象的引用. RefinedAbstra ...
- 【BIEE】由于排序顺序不兼容,集合操作失败
问题描述 使用BIEE数据透视表时,使用了UNION进行数据组合,但是在浏览结果时意外出错了,报错如下截图: 问题分析 原因暂时未知 问题解决 目前使用UNION进行聚合,只需要将UNION修改为UN ...
- flashplayer
http://www.adobe.com/support/flashplayer/downloads.html
- Dephi泛型
TArray TEnumerator(抽象) TEnumerable(抽象) 实际使用:TList TQueue TStack TPair TDictionary ,内部都包含 TValueEnume ...
- mfs客户端挂载
1.安装fuse yum install fuse fuse-devel 2.加载fuse模块 modprobe fuse 3.创建mfs用户 useradd mfs -s /sbin/nologin ...
- Spring在注入bean异常时的替换
情形:需要把数据库1的连接池A注入到DAO中,但是如果数据库A的连接池实例化失败了整个项目也启动不了,这个时候希望用数据库2的连接池来替换. 这里没有想到什么好的解决方法,只是想到了工厂方法提供Bea ...
- MIC中函数和变量的声明
c++/c使用 __declspec(target(mic))函数或变量声明 或 __attribute__((target(mic)))函数或变量声明 举例如下: __attribute__((ta ...
- Java反射学习系列-绪论
Java反射学习系列-绪论 https://blog.csdn.net/hanchao5272/article/details/79358924
- staitic_cast原理与使用
本文以下述结构为例: 总结如下: 1) static_cast用于有直接或间接关系的指针或引用之间 转换.没有继承关系的指针不能用此转换,即使二者位于同一类体系中.比如,Left,Right之间不能用 ...