关闭

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

370人阅读 评论(0) 收藏 举报
分类:

每一个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 出对象]


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:114931次
    • 积分:2828
    • 等级:
    • 排名:第12926名
    • 原创:170篇
    • 转载:1篇
    • 译文:1篇
    • 评论:27条
    博客专栏
    最新评论