<<Effective C++>>读书笔记3: 资源管理

原创 2016年05月30日 15:55:12

每一个Item都很经典,都需要去思考揣摩,我在这里将要点抽象出来,便于日后快速回忆;我只是在做文章的“搬运工”。


        Item 13 使用对象管理资源
1. 当一个 auto_ptr 被销毁时,会自动删除它所指向的东西,所以不要让超过一个的 auto_ptr 指向同一个对象。如果发生了这种事情,那个对象就会被删除超过一次,而且会让你的程序进入未定义行为。为了防止这个问题,auto_ptrs 具有不同寻常的特性:拷贝它们(通过拷贝构造函数或者拷贝赋值运算符)就是将它们置为空,拷贝的指针被设想为资源的唯一所有权。
[不要将一个指针多次放入到auto_ptr或shared_ptr,否则这个指针会被释放多次]
2. auto_ptr 和shared_ptr 都在它们的析构函数中使用 delete,而不是 delete []。这就意味着不能将 auto_ptr 或 tr1::shared_ptr 用于动态分配的数组,可是那居然可以通过编译。
3. C++ 中没有可用于动态分配数组的类似 auto_ptr 或 shared_ptr 这样智能指针,那是因为vector 和 string 几乎总是能代替动态分配数组。
3. 与垃圾收集不同的是,无论如何,RCSP 不能打破循环引用(例如,两个没有其它使用者的对象互相指向对方)。
[RSCP和垃圾收集器有哪些不同?]
[auto_ptr已在C++11中被unique_ptr取代;而shared_ptr被从tr1引入到C++11]
[不要将一个指针多次放入到auto_ptr或shared_ptr,否则这个指针会被释放多次]

        Item 14 谨慎考虑资源管理类的拷贝行为
1. 当auto_ptr的对象释放时,auto_ptr 总是删除它的指针。shared_ptr 的缺省行为是当它所指向的东西的引用计数变为 0 的时候将它删除; 
2. shared_ptr还有一种处理方式是当引用计数变为 0 时调用的一个函数或者函数对象。(在构造函数中分别传入裸指针和函数)
  [在应用计数为0时,不调用delete;是一种很好的支持Mutex的lock与unlock的方式]
3. 一个类的析构函数(无论它是编译器生成还是用户定义)会自动调用这个类的非静态(non-static)数据成员的析构函数。
  [当一个类在析构时,会自动析构类成员的非静态数据成员]
  [本小节可以参考“实现一个简单的shared_ptr ”]
  
        Item 15 在资源管理类中访问裸资源
1. shared_ptr 和 auto_ptr 都提供一个 get 成员函数进行显示转换,也就是说,返回一个智能指针对象内部的裸指针(或它的一个副本)。
2. shared_ptr 和 auto_ptr 也都重载了指针解引用操作符(operator-> 和 operator*),而这样就允许隐式转换到底层的裸指针。
3. 访问裸资源可以通过显式转换或者隐式转换进行。通常,显式转换更安全,而隐式转换对客户来说更方便。
4. 函数返回一个 RAII 类内部的裸资源破坏了封装,但这是正确的,这并非像它开始看上去那样是个设计的祸患。RAII 类的存在并非为了封装什么东西;它的存在是为了确保一个特殊的动作:资源释放的发生。

        Item 16 使用相同形式的 new 和 delete
1. 一个数组的内存布局通常包含数组的大小n,这样可以使得 delete 更容易知道有多少个析构函数需要被调用。而一个单一对象的内存中缺乏这个信息。
   [n放在内存中什么位置呢?]
2. 如果你在 new 表达式中使用了 [],你也必须在相应的 delete 表达式中使用 []。如果你在 new 表达式中没有使用 [],在匹配的 delete 表达式中也不要使用 []。
3. 克制对数组类型使用 typedef(避免在delete时出错)。

        Item 17: 在一个独立的语句中将 new 出来的对象存入智能指针
1. 在一个独立的语句中将 new 出来的对象存入智能指针。如果疏忽了这一点,当异常发生时,可能引起微妙的资源泄漏。
  [不光要在智能指针中如此,适用于所有:在一个独立的语句中new 出对象]


版权声明:本文为博主原创文章,未经博主允许不得转载。

Effective C++读书笔记 第三部分 资源管理

所谓资源就是,一旦用了它,将来必须还给系统。C++程序中最常使用的资源就好似动态分配内存(如果你new了,却忘了delete,会导致内存泄露),但内存只是你必须管理的众多资源之一。其它常见的有文件描述...
  • lxhjh
  • lxhjh
  • 2013年05月21日 12:26
  • 658

Effective C++读书笔记 资源管理(之一)

Effective C++读书笔记 --By Nathan.Yu 2007-11-27-- 3 资源管理(之一) 常见的资源:文件描述器(file descriptors)、互斥锁(mutex...

《Effective C++》读书笔记之中资源管理

By Ryui Liu 2011/11/28 所谓资源就是一旦用了它,将来必须还给系统,如果不这样,糟糕的事情就会发送,如内存泄漏等等,c++中最常使用的资源就是动态内存,但内存只是必须管理的资源之...

Effective C++读书笔记---资源管理要点总结

什么是资源? 资源就是一旦使用,将来必须交还给系统,否则会发生各种异常情况。典型的资源就是动态内存分配。 其他常见资源包括互斥锁、数据库连接、画刷、网络sockets等。 有效管理资源的方式: ...
  • PENGH56
  • PENGH56
  • 2016年08月09日 22:00
  • 173

读书笔记《Effective C++》条款14:在资源管理类中小心copying行为

条款13导入这样的观念:“资源取得时机便是初始化时机(RAII)”,并以此作为“资源管理类”的脊柱,也描述了auto_ptr和shared_ptr如何将这个观念表现在heap-based资源上。然而并...

《Effective C++第三版》读书笔记——资源管理

3 资源管理 ~~~~~~~~~~~ 3.1 以对象管理资源 ===================    1. 标准程序库提供的auto_ptr,其析构函数自动对所指对象调用dele...

《Effective C#》读书笔记——了解.NET内存管理机制<.NET资源管理>

我们知道C#是一门虚拟机语言,在C#编译器首先将C#代码编译成IL代码,运行程序时CLR(Common Language Runtime,公共语言运行时)通过调用JIT(just-in-time Co...

读书笔记 effective c++ Item 13 用对象来管理资源

正文 回到顶部 1.不要手动释放从函数返回的堆资源 假设你正在处理一个模拟Investment的程序库,不同的Investmetn类型从Investment基类继承而来, 1 clas...

Effective C++之3 资源管理

Effective c++之资源管理介绍,包括智能指针的使用及在拷贝对象和新声明对象时应当注意的事项。...

Item 14:资源管理类要特别注意拷贝行为 Effective C++笔记

Item 14: Think carefully about copying behavior in resource-managing classes. 在Item 13:使用对象来管理资...
  • yangjvn
  • yangjvn
  • 2015年08月27日 09:37
  • 873
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:<<Effective C++>>读书笔记3: 资源管理
举报原因:
原因补充:

(最多只允许输入30个字)