謹慎考慮資源管理類的拷貝行爲
有些對象是不能夠被拷貝的,那麼就需要禁止拷貝,禁止拷貝的方法:
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 類的拷貝行爲不接受拷貝和進行引用計數,但是其它行爲是有可能的。