C 深拷貝和淺拷貝

2021-07-14 15:17:02 字數 888 閱讀 2840

在學習string的時候才開始正式認識深淺拷貝,現在總結下,方便以後學習。

淺拷貝

淺拷貝就是 對記憶體位址的複製,使目標物件指標和源物件指標指向同一塊位址空間。

例如:

char* p = new char[10];

char* ptr = p;

淺拷貝是對物件的簡單拷貝,讓幾個指標都指向同一塊位址空間,在釋放這段空間的時候會產生「對已釋放的空間再次釋放」,導致程式中斷。

實現string遇到的淺拷貝:

如果在string中沒有顯式給出拷貝建構函式,那麼系統會預設合成乙個拷貝建構函式,如下:

string( string& s)

這樣就導致了兩個物件共用一塊記憶體,在物件消亡呼叫析構函式時,會對同一塊空間釋放多次,程式就中斷了。這樣就會提到深拷貝。

深拷貝

深拷貝拷貝的是物件的具體內容,而記憶體位址是自主分配的,拷貝結束之後,兩個物件雖然存的值是相同的,但是記憶體位址不一樣,兩個物件也互不影響,互不干涉。

在string中,解決上述淺拷貝問題的方法:

string(const string& s)

:_str(new char[strlen(s._str) + 1])//自己申請了記憶體

其實在string的賦值運算子過載也同樣會遇到這樣的問題,如同上面一樣,就能很好的解決。

總結:在有指標的情況下,淺拷貝只是增加了乙個指標指向已經存在的記憶體,而深拷貝就是增加乙個指標並且申請乙個新的記憶體,使這個增加的指標指向這個新的記憶體,採用深拷貝的情況下,釋放記憶體的時候就不會出現在淺拷貝時重複釋放同一記憶體的錯誤!

C 淺拷貝和深拷貝

class test test const test t val new int t.val test private int val 現在定義兩個物件,test t1 9 test t2 t1 如果你不提供copy建構函式 注釋掉的那個 那麼t1和t2的成員 val指向同乙個物件,當析構的時候,同...

c 深拷貝和淺拷貝

深拷貝和淺拷貝 ca const ca c 就是我們自定義的拷貝建構函式。可見,拷貝建構函式是一種特別的建構函式,函式的名稱必須和類名稱一致,他的唯一的乙個引數是本型別的乙個引用變數,該引數是const型別,不可變的。例如 類x的拷貝建構函式的形式為x x x 當用乙個已初始化過了的自定義類型別物件...

c 深拷貝和淺拷貝

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