C 深拷貝與淺拷貝

2021-08-10 19:52:31 字數 1686 閱讀 7627

淺拷貝,指的是在物件複製時,只是對物件中的資料成員進行簡單的複製,預設拷貝建構函式執行的也是淺拷貝。簡單的說,淺拷貝就是值傳遞,將源空間裡面的內容複製到目標空間中。

缺陷:多個指標可能共用管理一塊記憶體空間,在釋放時,導致對一塊空間的多次釋放,造成記憶體洩露。

在「深拷貝」的情況下,對於物件中動態成員,就不能僅僅簡單地賦值了,而應該重新動態分配空間。

includeusing namespace std;

class

string

else

}string(const

string& s)

:_pstr(s._pstr)

string& operator=(const

string& s)

return *this;

}~string ()

}private:

char* _pstr;

};void funtest()

int main ()

引入引用計數:指示當前空間有多少指標指向該空間.

注意:用計數可以普通的成員變數,引用計數不可以為普通的成員變數,因為一旦出了作用域,該空間被銷毀,達不到想要的效果.因此可以採用private型別的static型變數.

#include

using

namespace

std;

class string

else

}string (const string& s)

:_pstr(s._pstr)

,_pcount(s._pcount)

string& operator=(const string& s)

_pstr =s._pstr;

_pcount=s._pcount;

++_pcount;

}return *this;

}~string ()

}private:

char* _pstr;

int* _pcount;

};void funtest()

int main()

寫時拷貝:如果要朝當前物件寫東西,建議使用這種方式,且單執行緒不會有問題

#include

using

namespace

std;

class string

else

getraf()=1;

}string (const string& s)

:_pstr(s._pstr)

string& operator=(const string& s)

return *this;

}~string ()

char& operator (size_t index)

return _pstr[index];

}const

char& operator (size_t index)const

private:

int& getraf()

void release()

}private:

char* _pstr;

};void funtest()

int main()

C 深拷貝 與 淺拷貝

最近在寫一些c 程式,遇到個問題,記憶體會出錯,查了一些材料,終於發現問題所在了,原來碰到了傳說中的深拷貝和淺拷貝問題了,檢視一些材料,現在對這個問題做個總結 在類定義中,預設是淺拷貝,即 位拷貝 用在基本類中或者一些沒有指標的自定義型別中沒有一點問題,但是當遇到含有指標變數的自定義型別的時候,就會...

C 淺拷貝與深拷貝

淺拷貝 shallow copy 指的是當物件的字段被拷貝的時候,字段應用的物件不會被拷貝。深拷貝是對物件例項當中的字段引用的物件也進行拷貝的一種方式。淺拷貝可以通過將類實現介面icloneable class myclass icloneable 舉個簡單的例項 using system usin...

c 深拷貝與淺拷貝

對於普通型別的物件來說,它們之間的複製是很簡單的,例如 int a 88 int b a 而類物件與普通物件不同,類物件內部結構一般較為複雜,存在各種成員變數。下面看乙個類物件拷貝的簡單例子。iostream using namespace std class cexample void show ...