Effective C++第三章读后感
这一章的主要内容是围绕资源管理。
不论哪一种资源,重要的是,当你不再使用时,必须将它还给系统。
条款13:以对象管理资源。
将资源放进对象内,当控制流离开时,该对象的析构函数会自动释放那些资源。
获得资源后立刻放进管理对象
管理对象运用析构函数确保资源被释放。
标准库里提供的智能指针正是针对这种形势而设计的特制产品。其析构函数自动对其对象调用delete.
由于智能指针被销毁时会自动删除它所指之物,所以一定要注意别让多个智能指针指向同一个对象。如果真是那样,对象会被删除一次以上,而那样会使你的程序搭上驶向“未定义行为”的列车上。为了预防这个问题,智能指针有一个不寻常的性质:若通过拷贝构造函数或拷贝操作符复制他们,他们会变成空,而复制的指针将取得资源的唯一拥有权。
但智能指针并非管理动态分配资源的神兵利器。举个例子,STL容器要求其元素发挥正常的复制行为,因此这些容器容不下智能指针。
智能指针的替代方案是“引用计数型智慧指针”,持续追踪共有多少对象指向某笔资源,并在无人指向它时自动删除该资源。但引用技术型智慧指针无法打破环状使用。例如两个其实已经没被使用的对象彼此互指。
两种指针都在其析构函数内做delete操作,而不是做delete[]操作,当为数组动态分配一块内存空间时,发生内存泄漏。可叹的是,这种操作在编译器中是可以通过的。但是,vector和string几乎总是可以取代动态分配而得到的数组。
作为最后批注,我必须指出,工厂函数返回的“未加工指针”简直是对资源泄露的一个死亡邀约,因为调用者极易在这个指针身上忘记调用delete.首先必须记得将工厂函数的返回值存储于智能指针对象内。
条款14:在资源管理类中小心copying行为
并非所有资源都是基于堆的,对那种资源而言,智能指针和引用计数型指针往往不适合作为资源掌管者,这时候需要构建自己的资源管理类。
禁止复制
对底层资源祭出“引用计数法”
辛运的是引用计数指针允许指定所谓的删除器,那是一个函数或函数对象,当引用次数为0时便被调用,删除器对tr1::shared_ptr构造函数而言是可有可无的第二参数。
复制底部资源
只要你喜欢,可以针对一份资源拥有任意数量的复件,而你需要“资源管理类”的唯一理由是,当你不再需要某个复件时确保它被释放。在此情况下复制资源管理对象,应该同时也复制其包裹的资源。,这时,进行的是深度拷贝。
转移底部资源的拥有权
条款15:在资源管理类中提供对原始资源的访问
如果你希望有一个函数来处理原始指针对象,就必须将智能指针或引用计数型指针转换为原始指针。这两种指针都提供一个get成员函数,用来执行显式转换。
条款16:成对使用new和delete时采取相同形式
条款17:以独立语句将newed置入智能指针
因为编译器在同一行语句内有重新排列的自由,在开辟内存和放入资源管理类对象之间,调用另一个函数时可能会发生意外,此时就有资源泄露的风险。这一条是与第15条有关。开辟内存后先直接放入引用计数指针,在进行类型转换,再进行其 他操作。
std::str1::shared_ptr<widget> pw(new Widget);
processWidget(pw,priority());
