淺拷貝與深拷貝

2021-08-26 23:31:53 字數 685 閱讀 1169

淺拷貝,只是對指標的拷貝,拷貝後兩個指標指向同乙個記憶體空間,深拷貝不但對指標進行拷貝,而且對指標指向的內容進行拷貝,經深拷貝後的指標是指向兩個不同位址的指標。

主要出問題在拷貝建構函式時,如果成員變數含有指標就容易出問題、

假如有乙個成員變數的指標,char *m_data;

其一,淺拷貝只是拷貝了指標,使得兩個指標指向同乙個位址,這樣在物件塊結束,呼叫函式析構的時,會造成同乙份資源析構2次,即delete同一塊記憶體2次,造成程式崩潰。

其二,淺拷貝使得obj.m_data和obj1.m_data指向同一塊記憶體,任何一方的變動都會影響到另一方。

其三,在釋放記憶體的時候,會造成obj1.m_data原有的記憶體沒有被釋放(這句話,剛開始我不太理解,如果沒有走自定義的拷貝建構函式,申請記憶體空間,a obj1(obj);也不走預設建構函式,走的是預設的拷貝建構函式,何來分配空間直說,更不會造成obj1.m_data原有的記憶體沒有被釋放,這裡剛開始我一直有疑問),造成記憶體洩露。

事實是這樣的,當delete obj.m_data, obj.m_data記憶體被釋放後,由於之前obj.m_data和obj1.m_data指向的是同乙個記憶體空間,obj1.m_data所指的空間不能在被利用了,delete obj1.m_data也不會成功,一致已經無法操作該空間,所以導致記憶體洩露。

深拷貝採用了在堆記憶體中申請新的空間來儲存資料,這樣每個可以避免指標懸掛。

「淺拷貝」與「深拷貝」

c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...

淺拷貝與深拷貝

淺拷貝 1 2 myclass a,b a b 為了封裝性和解耦,同型別的兩個物件之間進行賦值操作時,所有成員變數被複製,包括私有成員 指標變數。類的成員函式在傳遞或返回物件時都會進行物件複製產生臨時物件,比如函式呼叫時實參變為形參,以及函式返回物件。考慮到效能和使用者要求不同,編譯器不複製物件內部...

「淺拷貝」與「深拷貝」

c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...