Effective C++ 条款14

谨慎考虑资源管理类的拷贝行为

有些对象是不能够被拷贝的,那么就需要禁止拷贝,禁止拷贝的方法:

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 类的拷贝行为不接受拷贝和进行引用计数,但是其它行为是有可能的。

猜你喜欢

转载自blog.csdn.net/qq_31638535/article/details/89022982