谨慎考虑资源管理类的拷贝行为
有些对象是不能够被拷贝的,那么就需要禁止拷贝,禁止拷贝的方法:
Item 6 解释了如何做到这一点。声明拷贝操作为私有。对于 Lock,看起来也许像这样:
class Lock: private Uncopyable { // prohibit copying — see
public: // Item 6
... // as before
};
私有继承,基类的私有成员是无法访问的,非私有成员,在类内部可以访问。
也可以通过计数拷贝,利用tr1::shared_ptr:
std::tr1::shared_ptr<Mutex> mutexPtr
下面理解一下两种拷贝:
深度拷贝: 也就是说,拷贝一个资源管理类需要完成一次“深层拷贝”。这种拷贝是拷贝一个副本。
以string为例:某些标准 string 类型的实现是由堆内存的指针组成,堆内存中存储着组成那个 string 的字符。这样的字符串对象包含指向堆内存的指针。当一个 string 对象被拷贝,这个副本应该由那个指针和它所指向的内存组成。这样的 strings 表现为深层拷贝
浅层拷贝:传递底层资源的所有权。在某些特殊场合,你可能希望确保只有一个 RAII 对象引用一个裸资源(raw resource),而当这个 RAII 对象被拷贝的时候,资源的所有权从被拷贝的对象传递到拷贝对象。相当于指针还是那个指针,只不过指向这个指针的对象变多了。
things to Remember
拷贝一个 RAII 对象必须拷贝它所管理的资源,所以资源的拷贝行为决定了 RAII 对象的拷贝行为。
普通的 RAII 类的拷贝行为不接受拷贝和进行引用计数,但是其它行为是有可能的。