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 類的拷貝行爲不接受拷貝和進行引用計數,但是其它行爲是有可能的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章