C 什麼是深淺拷貝,深淺拷貝的區別?

2021-10-23 20:38:12 字數 2093 閱讀 8530

// 淺拷貝:

class

string

string

(const string &s)

:_str

(s._str)

string &

operator=(

const string &s)

//返回引用是為了連續的賦值

return

*this;}

~string()

// 防止野指標的出現

_str =

null;}

char

*_str_get()

void

_str_set

(const

char

*s)private

:char

*_str;

};

淺拷貝的方式就是將類中的指標指向新的指標

這樣就是實現了兩個執政指向同一空間

問題1:通過類1修改空間內容,類2的內容也回改變

問題2:如果通過類1釋放該空間過後,再通過類2釋放空間就會出錯

// 深拷貝:

class

mystring

mystring

(const mystring &s)

:_str

(null

) mystring &

operator=(

const mystring &s)

//返回引用是為了連續的賦值

return

*this;}

~mystring()

_str =

null;}

char

*_str_get()

void

_str_set

(const

char

*s)private

:char

*_str;

};

深拷貝的方式就是通過重新構造乙個區域性類temp獲取新的指標

然後通過swap交換兩個類的指標,相當於使_str重新指向乙個新開闢的空間

因為是區域性類,執行完函式過後相應的就會被釋放掉

#include

#include

using

namespace std;

// 淺拷貝:

class

string

string

(const string &s)

:_str

(s._str)

string &

operator=(

const string &s)

//返回引用是為了連續的賦值

return

*this;}

~string()

// 防止野指標的出現

_str =

null;}

char

*_str_get()

void

_str_set

(const

char

*s)private

:char

*_str;};

// 深拷貝:

class

mystring

mystring

(const mystring &s)

:_str

(null

) mystring &

operator=(

const mystring &s)

//返回引用是為了連續的賦值

return

*this;}

~mystring()

_str =

null;}

char

*_str_get()

void

_str_set

(const

char

*s)private

:char

*_str;};

intmain

(int argc,

char

**ar**)

C 深淺拷貝

當結構體中沒有指標時,可進行淺拷貝,資料也會從乙個結構體拷貝到另乙個結構體 兩個結構體都存乙份資料 但當結構體中有指標的時候,假如使用使用淺拷貝,會使兩個結構體使用的指標都指向同乙個記憶體位址,在析構的時候會造成記憶體洩漏。深拷貝 需要對含有指標的結構體,使用 new 申請新的記憶體空間去儲存拷貝的...

c 深淺拷貝

對於普通型別的物件來說,它們之間的複製是很簡單的,例如 int a 88 int b a 而類物件與普通物件不同,類物件內部結構一般較為複雜,存在各種成員變數。下面看乙個類物件拷貝的簡單例子。執行程式,螢幕輸出100。從以上 的執行結果可以看出,系統為物件b分配了記憶體並完成了與物件a的複製過程。就...

深淺拷貝以及深淺拷貝的方法

先考慮一種情況,對乙個已知物件進行拷貝,編譯系統會自動呼叫一種建構函式 拷貝建構函式,如果使用者未定義拷貝建構函式,則會呼叫預設拷貝建構函式。執行結果 呼叫一次建構函式,呼叫兩次析構函式,兩個物件的指標成員所指記憶體相同,name指標被分配一次記憶體,但是程式結束時該記憶體卻被釋放了兩次,會造成記憶...