淺拷貝和深拷貝

2021-07-30 08:57:10 字數 863 閱讀 3241

用一句簡單的話來說就是淺拷貝,只是對指標的拷貝,拷貝後兩個指標指向同乙個記憶體空間,深拷貝不但對指標進行拷貝,而且對指標指向的內容進行拷貝,經深拷貝後的指標是指向兩個不同位址的指標。

先說下自己的理解吧,淺拷貝,即在定義乙個類a,使用類似a obj; a obj1(obj);或者a obj1 = obj; 時候,由於沒有自定義拷貝建構函式,c++編譯器自動會產生乙個預設的拷貝建構函式。這個預設的拷貝建構函式採用的是「位拷貝」(淺拷貝),而非「值拷貝」(深拷貝)的方式,如果類中含有指標變數,預設的拷貝建構函式必定出錯。

class string  

;

string(const string &other)

這是一種深拷貝。 可以看到在拷貝建構函式中為成員變數申請了新的記憶體空間,這就使得兩個物件的成員變數不指向同乙個記憶體空間。

#include 

class a

~a() // 析構函式,釋放動態分配的空間

} private:

char *m_data; // 一指標成員

};

int main()

執行結果:

* glibc detected./******: double free or corruption (fasttop): 0x000000000c62a010 **

分析:由於沒有拷貝建構函式,走編譯器預設的拷貝建構函式,a b(a); 進行物件析構時,會造成釋放同一記憶體空間2次,導致記憶體洩露。

這時候我們可以通過自定義拷貝建構函式。

深拷貝和淺拷貝

淺拷貝就是物件的資料成員之間的簡單賦值,如你設計了乙個沒有類而沒有提供它的複製建構函式,當用該類的乙個物件去給令乙個物件賦值時所執行的過程就是淺拷貝,如 class a a private int data int main 這一句b a 就是淺拷貝,執行完這句後b.data 5 如果物件中沒有其他...

淺拷貝和深拷貝

以下情況都會呼叫拷貝建構函式 乙個物件以值傳遞的方式傳入函式體 例如 已知class a,class b void func a a void func a a func b b 此時函式對b的操作是呼叫拷貝建構函式後的臨時拷貝物件。多數傳指標 乙個物件以值傳遞的方式從函式返回 如 return b...

深拷貝和淺拷貝

ios提供了copy和mutablecopy方法,顧名思義,copy就是複製了乙個imutable的物件,而mutablecopy就是複製了乙個mutable的物件。以下將舉幾個例子來說明。1 系統的非容器類物件 這裡指的是nsstring nsnumber等等一類的物件。nsstring stri...