您的位置:首页 > 编程语言 > C语言/C++

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

2016-05-30 15:55 519 查看
每一个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 出对象]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: