条款13:以对象管理资源

许多资源被动态分配于heap内而后被用于单一区块或函数内。它们应该在控制流离开那个区块或函数时被释放。标准程序库提供的auto_ptr正是针对这种形式而设计的特制产品。auto_ptr是个类指针对象,也就是智能指针,其析构函数自动对其所指对象调用delete。

以对象管理资源的两个想法:获得资源后立刻放进管理对象内;管理对象运用析构函数确保资源被释放。

若通过copy构造函数或copy assignment操作符复制它们,它们会变成null,而复制所得的指针将取得资源的唯一拥有权。

auto_ptr的替代方案是引用计数型智慧指针(reference-counting smart pointer;RCSP),持续追踪共有多少对象指向某笔资源,并在无人指向它们时自动删除该资源。RCSPs提供的行为类似垃圾回收,不同的是RCSPs无法打破环状引用。

记住:

为防止资源泄露,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源。

两个通常被使用的RAII classes分别是tr1::shared_ptr和auto_ptr。前者通常较佳选择,因为其copy行为比较直观。若选择auto_ptr,复制动作会使被指物指向null。

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

当一个RAII对象被复制时,会发生什么事?

  • 禁止复制。许多时候允许RAII对象被复制并不合理。因为很少能够合理拥有同步化基础器物的副本。如果复制动作对RAII class并不合理,你便应该禁止之。
  • 对底层资源祭出引用计数法。有时候我们希望保有资源,直到它的最后一个使用者被销毁。这种情况下复制RAII对象时,应该将资源的被引用数递增。
  • 复制底部资源。可以针对一份资源拥有其任意数量的副本。复制资源管理对象时,进行深度拷贝。
  • 转移底部资源的拥有权。希望确保永远只有一个RAII对象指向一个未加工资源,即使RAII对象被复制依然如此。此时资源的拥有权会从被复制物转移到目标物。

记住:

复制RAII对象必须一并复制它所管理的资源,所以资源的copying行为决定RAII对象的copying行为。

普遍而常见的RAII class copying行为是:抑制copying、施行引用计数法。不过其他行为也都可能被实现。

条款15:在资源管理类中提供对原始资源的访问

资源管理类很棒,它们是你对抗资源泄露的堡垒。排除此等泄露是良好设计系统的根本性质。

许多APIs直接指涉资源,只得绕过资源管理对象直接访问原始资源。

有两个做法可以达成目标:显式转换和隐式转换。

tr1::shared_ptr和auto_ptr都提供一个get成员函数,用来执行显式转换,也就是它会返回智能指针内部的原始指针。智能指针也重载了指针取值操作符(operator->和operator*),它们允许隐式转换至底部原始指针。

有时候还是必须取得RAII对象内的原始资源 ,做法是提供一个隐式转换函数。

是否该提供一个显式转换函数将RAII class转换为其底部资源,或是应该提供隐式转换,答案主要取决于RAII class被设计执行的特定工作,以及它被使用的情况。

记住:

APIs往往要求访问原始资源,所以每一个RAII class应该提供一个取得其所管理之资源的方法。

条款16:成对使用new和delete时要采取相同形式

当你使用new也就是通过new动态生成一个对象,有两件事发生。第一,内存被分配出来。第二,针对此内存会有一个或更多构造函数被调用。当你使用delete,也有两件事发生:针对此内存会有一个或更多析构函数被调用,然后内存才被释放。delete的最大问题在于:即将被删除的内存之内究竟存有多少对象?这个问题的答案决定了有多少个析构函数必须被调用起来。

当你撰写的class含有一个指针指向动态内存分配,并提供多个构造函数时,必须小心的在所有构造函数中使用相同形式的new将指针成员初始化。

最好不要对数组形式做typedefs动作。

记住:

如果你在new表达式中使用[],必须在相应的delete表达式中也使用[]。如果你在new表达式中不使用[],一定不要在相应的delete表达式中使用[]。

条款17:以独立语句将newed对象置入智能指针

编译器不是以特定次序完成函数参数的核算。

分离语句,因为编译器对跨越语句的各项操作没有重新排列的自由。

记住:

以独立语句将newed对象储存于智能指针内。如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源泄露。

Effective C++ 笔记三 资源管理的更多相关文章

  1. Effective C++笔记(三):资源管理

    参考:http://www.cnblogs.com/ronny/p/3745098.html 资源:动态分配的内存.文件描述器.互斥锁.图形界面中的字型与笔刷.数据库连接以及网络sockets等,   ...

  2. Effective C++笔记:资源管理

    资源:动态分配的内存.文件描述器.互斥锁.图形界面中的字型与笔刷.数据库连接以及网络sockets等,无论哪一种资源,重要的是,当你不再使用它时,必须将它还给系统. 条款13:以对象管理资源 当我们向 ...

  3. EC++学习笔记(三) 资源管理

    条款13:以对象管理资源 资源包括:动态分配内存.文件描述符.网络socket.互斥锁.数据库连接 把资源放进对象内,可以依赖c++的"析构函数自动调用机制"确保资源被释放智能指针 ...

  4. Effective Java笔记一 创建和销毁对象

    Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...

  5. redis相关笔记(三.redis设计与实现(笔记))

    redis笔记一 redis笔记二 redis笔记三 1.数据结构 1.1.简单动态字符串: 其属性有int len:长度,int free:空闲长度,char[] bur:字符数组(内容) 获取字符 ...

  6. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  7. 《CMake实践》笔记三:构建静态库(.a) 与 动态库(.so) 及 如何使用外部共享库和头文件

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  8. Mastering Web Application Development with AngularJS 读书笔记(三)

    第一章笔记 (三) 一.Factories factory 方法是创建对象的另一种方式,与service相比更灵活,因为可以注册可任何任意对象创造功能.例如: myMod.factory('notif ...

  9. Python 学习笔记三

    笔记三:函数 笔记二已取消置顶链接地址:http://www.cnblogs.com/dzzy/p/5289186.html 函数的作用: 給代码段命名,就像变量給数字命名一样 可以接收参数,像arg ...

随机推荐

  1. 【HDU 1133】 Buy the Ticket (卡特兰数)

    Buy the Ticket Problem Description The "Harry Potter and the Goblet of Fire" will be on sh ...

  2. java自定义接口

    compareTo:根据该数值是小于.等于.或大于 val 返回 -1.0 或 1:

  3. c标准库和运行时库

    c运行时库与c标准库的区别 c标准库包括常用的数学函数.字符串操作函数等等,这些函数都是由编程高手写的,效率高,很少出错,而且是完全符合c语言标准的函数. c运行库可以说是c标准库的扩展集,它是完全包 ...

  4. android View 关于transient

    今天来研究一下 ListView 的删除动画 由于 ListView 卷动时会把画面上的 item 重用以显示不同数据 这样会导致我们可能会删除到非正确的 item 或是出现显示上的问题(该 item ...

  5. USACO3.41Closed Fences(几何)

    这题水的真不易..300多行 累死了 对着数据查错啊 枚举每个边上的点到源点 是否中间隔着别的边  每条边划分500份就够了  注意一下与源点在一条直线上的边不算 几何 啊,,好繁琐 参考各种模版.. ...

  6. WordPress Videowall插件‘page_id’参数跨站脚本漏洞

    漏洞名称: WordPress Videowall插件‘page_id’参数跨站脚本漏洞 CNNVD编号: CNNVD-201310-502 发布时间: 2013-10-23 更新时间: 2013-1 ...

  7. NOI2003 文本编辑器editor

    1507: [NOI2003]Editor Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 1908  Solved: 738[Submit][Statu ...

  8. 动态规划(树形DP):LNOI 2016 侦察守卫

    Sample Input 12 2 8 9 12 6 1 1 5 1 4 8 10 6 10 1 2 3 5 6 7 8 9 10 11 1 3 2 3 3 4 4 5 4 6 4 7 7 8 8 9 ...

  9. HDU-2521 反素数

    反素数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  10. Unix环境高级编程

    1.  windows下编辑的程序怎么上传到linux下执行? //Service vsftpd status查看linux ftp服务是否开启: Linuxi ip:192.168.40.128 打 ...