Effective C++读书笔记
--By
Nathan.Yu 2007-11-28--
3 资源管理(之二)
条款14:在资源管理类中小心copying行为(Think carefully about copying
behavior in resource-managing classes)
“当一个RAII对象被复制时,会发生什么?”这是每个RAII class作者必须面对的一般化问题。有4中可能:
1、
禁止复制。(见条款6:
Uncopyable类)
2、
对底层资源祭出“引用计数”(reference-count)。通常只要内含一个tr1::shared_ptr成员变量,RAII class便可实现出referenct-counting copying行为。即将成员T*改为tr1::shared_ptr<T>。
tr1::shared_ptr的缺省行为是“当引用次数为0时删除所指对象”。但tr1::shared_ptr允许指定“删除器”(deleter)——是一个函数或函数对象(function object),当引用次数为0时被调用。“删除器”(deleter)作为tr1::shared_ptr构造函数的第二个参数传入。
3、
复制底部资源。——“深度拷贝”,比如字符串类,当复制发生时,不论指针或指针所指内存都要被复制。
4、
转移底部资源的拥有权。如auto_ptr。
请记住:
1、
复制RAII对象必须一并复制它所管理的资源,所以资源的copying行为决定RAII对象的copying行为。
2、
普遍而常见的RAII class copying行为是:抑制copying、施行引用计数法。不过其他行为也都可能被实现。