Effective C++读书笔记
--By Nathan.Yu 2007-11-27--
3 资源管理(之一)
常见的资源:文件描述器(file descriptors)、互斥锁(mutex locks)、图形界面中的字型和笔刷、数据库连接、网络sockets。
不论哪一种资源,重要的是,当你不再使用它时,必须将它还给系统。
条款13:以对象管理资源(Use objects to manage resources)
auto_ptr是一个“类指针(pointer-like)对象”,也就是所谓的“智能指针”,其析构函数自动对其所指对象调用delete。
RAII(Resource Acquisition Is Initialization):资源取得即初始化。
<注意>由于auto_ptr被销毁时会自动删除它所指之物,所以别让多个auto_ptr同时指向同一对象。为了预防这个问题,auto_ptrs有一个不寻常的性质:
若通过copy构造函数或copy assignment操作符复制它们,它们会变成null,而复制所得的指针将取得资源的唯一拥有权!
由于这一诡异的复制行为,加上“受auto_ptrs管理的资源必须绝对没有一个以上的auto_ptr同时指向它”,意味着auto_ptr并非管理动态分配资源的神兵利器。
STL容器要求其元素发挥“正常”赋值行为,因此不能用auto_ptr管理它们。
auto_ptr的替代方案是“引用计数型智能指针”(reference-counting smart pointer, RCSP)。
RCSPs提供的行为类似垃圾回收(GC, garbage collection),不同的是RCSPs无法打破环状引用(cycles of reference, 例如两个其实已经没被使用的对象彼此互指,好像还处在“被使用”状态)。
RCSPs举例:tr1::shared_ptr
<注意>auto_ptr和tr1::shared_ptr两者都在析构函数内做delete而不是delete[]动作。意味着两者都不能用在动态分配的数组上。
对数组可用容器如vector等代替。
然,boost::scoped_array和boost::shared_array则提供了上述管理数组的能力。
请记住:
1、 为防止资源泄漏,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源。
2、 两个被使用的RAII classes分别是tr1::shared_ptr和auto_ptr。前者通常是较佳选择,因为其copy行为比较直观。若选择auto_ptr,复制动作会使它(被复制物)指向null。