C 中的深拷貝與淺拷貝

2021-09-23 10:29:21 字數 1343 閱讀 7051

1、拷貝建構函式

定義:如果乙個類的建構函式的第乙個引數是類自身類型別的引用,且任何額外引數都有預設值,則此建構函式為拷貝建構函式。

由此可見,拷貝建構函式是一種特殊的建構函式,乙個類可以有多個拷貝建構函式,既可以是public的,也可以是private的(特殊用法,如設計模式中的單例模式需要將拷貝建構函式置為private許可權以防止外部的拷貝,確保唯一例項):

class a;

person::person()

person::~person()

int main()

system("pause");

return 0;

}

執行結果(vc和centos)如下:

4、結果分析

由於物件在進行拷貝賦值(準確的說是在離開作用域後析構時)的時候發現類中沒有自定義的拷貝構造,所以使用了編譯器合成的預設拷貝建構函式進行了指標的拷貝,結果是:兩個指標指向同一位址,隨後進行了兩次delete同一指標導致崩潰。

5、淺拷貝與深拷貝

位拷貝(淺拷貝)只是對指標的拷貝,拷貝後兩個指標指向同乙個記憶體空間;

值拷貝(深拷貝)不但對指標進行拷貝,而且對指標指向的內容進行拷貝(重新分配記憶體空間),經深拷貝後的指標指向的是兩個不同位址的指標(深拷貝採用在堆記憶體中申請新的空間來儲存資料,避免懸垂指標的產生)。

預設拷貝建構函式使用的就是淺拷貝,只是對物件中的資料成員進行簡單的賦值,如果物件中存在動態成員(如指標),淺拷貝就會出現問題。因此,當乙個類中存在指標成員時,應使用自定義的拷貝構造,修改上述**如下:

#include using namespace std;

class person ;

person::person()

person::~person()

}person::person(const person &s)

{ name = new char(20);

memcpy(name, s.name, strlen(s.name));

cout<

同樣的,對於含有指標型別的結構體進行複製時也存在淺拷貝與深拷貝的問題(如struct node1 = node2,node2中含有指標變數時這種拷貝為淺拷貝),進行深拷貝時必須為第二個結構體的指標變數重新申請空間後再進行拷貝。

6、參考

①、②、

③、

c 中深拷貝與淺拷貝

如果沒有自定義複製建構函式,則系統會建立預設的複製建構函式,但系統建立的預設複製建構函式只會執行 淺拷貝 即將被拷貝物件的資料成員的值一一賦值給新建立的物件,若該類的資料成員中有指標成員,則會使得新的物件的指標所指向的位址與被拷貝物件的指標所指向的位址相同,delete該指標時則會導致兩次重複del...

C 中的淺拷貝與深拷貝

用自定義的string類解釋什麼是淺拷貝什麼是深拷貝。class string 淺拷貝是在呼叫拷貝函式時進行了值拷貝,這樣的拷貝看似沒有問題,在呼叫析構函式時會導致記憶體洩漏,系統奔潰。define crt secure no warnings 1 includeusing namespace st...

C 中的深拷貝與淺拷貝

淺拷貝 又稱值拷貝,將源物件的值拷貝到目標物件中去,本質上來說源物件和目標物件共用乙份實體,只是所引用的變數名不同,位址其實還是相同的。舉個簡單的例子,你的小名叫西西,大名叫冬冬,當別人叫你西西或者冬冬的時候你都會答應,這兩個名字雖然不相同,但是都指的是你。假設有乙個string類,string s...