C 淺拷貝 深拷貝 寫時拷貝的清楚講解

2021-09-26 08:54:04 字數 1013 閱讀 3413

淺拷貝:

在拷貝構造的時候,直接將原內容的位址交給要拷貝的類,兩個類共同指向一片空間。最終導致的問題是,s1、s2共用同一塊記憶體空間,在釋放時同一塊 空間被釋放多次而引起程式崩潰,這種拷貝方式,稱為淺拷貝。

淺拷貝:也稱位拷貝,編譯器只是將物件中的值拷貝過來。

深拷貝:

通過開闢和源空間大小相同的空間並將內容拷貝下來再進行操作。不論是否對s2進行操作,都會拷貝一片相同大小的空間以及內容下來。

寫時拷貝:

寫時拷貝就是一種拖延症,是在淺拷貝的基礎之上增加了引用計數的方式來實現的。

引用計數:用來記錄資源使用者的個數。在構造時,將資源的計數給成1,每增加乙個物件使用該資源,就給 計數增加1,當某個物件被銷毀時,先給該計數減1,然後再檢查是否需要釋放資源,如果計數為1,說明該 物件時資源的最後乙個使用者,將該資源釋放;否則就不能釋放,因為還有其他物件在使用該資源。

#include using namespace std;

class string

string(const string& str)

: _str(str._str)

,_refcount(str._refcount)

~string()

string& operator= (const string& s)

return *this;

}void release()

}private:

char* _str;

int* _refcount;

};

C 淺拷貝 深拷貝 寫時拷貝

淺拷貝 編譯器只是直接將指標的值拷貝過來,結果多個物件共用了一塊記憶體,當乙個物件呼叫了析構函式將這塊記憶體釋放掉之後,另一些物件不知道這塊空間已經還給了系統,再次呼叫析構函式進行釋放時發現已經釋放了,就會造成程式崩潰。在類的成員中有指標型別的成員變數的時候,必須對其寫出顯式的拷貝建構函式和賦值運算...

C 淺拷貝 深拷貝 寫時拷貝

不是拷貝了基本型別的資料,而引用型別資料,複製後也是會發生引用,我們把這種拷貝叫做淺拷貝。換句話說,淺複製僅僅是指向被複製的記憶體位址,如果原位址中物件被改變了,那麼淺複製出來的物件也會相應改變。int main 在計算機中開闢了一塊新的記憶體位址用於存放複製的物件。上述 中p1和p2指向的同一塊記...

淺拷貝,深拷貝,寫時拷貝

淺拷貝 拷貝構造時複製指標僅僅是對指標的值拷貝,而不開闢新的空間這樣就會造成在析構的時候。會對同一塊記憶體釋放兩次。深拷貝 拷貝構造時會開闢新的記憶體,並把記憶體中的值進行拷貝 寫時拷貝 就是當你在讀取一片空間時,系統並不會為你開闢乙個一模一樣的空間給你 只有在當你真正修改的時候,才會開闢一片空間給...