C 淺拷貝和深拷貝(String類)

2021-07-23 19:07:02 字數 2119 閱讀 7378

簡單的來說,【淺拷貝】是增加了乙個指標,指向原來已經存在的記憶體。而【深拷貝】是增加了乙個指標,並新開闢了一塊空間

讓指標指向這塊新開闢的空間。

【淺拷貝】在多個物件指向一塊空間的時候,釋放乙個空間會導致其他物件所使用的空間也被釋放了,再次釋放便會出現錯誤

為了形象化說明什麼是深拷貝和淺拷貝,我們就先寫乙個string類

類裡面包含【建構函式】【拷貝建構函式】【賦值運算子過載】,以及【析構函式】【輸出操作符「<

class string

else

}string(const string &s)

:pstr(s.pstr)//淺拷貝的問題,指向同一塊空間,可能造成釋放的錯誤 ,這是淺拷貝的缺點

{} string& operator=(const string&s)

return *this; }

~string()

} friend ostream&operator<

}

當我們釋放s3的時候,可以正常釋放

然而當釋放s2的時候,由於【s3已經釋放過了】,所以s2所指向的這段空間已經不屬於s1或者s2了

此時我們呼叫delete釋放的時候,必然會崩潰(畢竟人家本來就不屬於你呀)

深拷貝和淺拷貝的不同之處,僅僅在於修改了下【拷貝建構函式】,以及【賦值運算子的過載】

string(const string &s)

:pstr(new char[strlen(s.pstr)+1])

string& operator=(const string &s)

return *this;

}

對比一下淺拷貝的【拷貝建構函式】【賦值運算子過載】

string(const string &s)

:pstr(s.pstr)//淺拷貝的問題,指向同一塊空間,可能造成釋放的錯誤 ,這是淺拷貝的缺點

{} string& operator=(const string&s)

return *this;

}

class string

【拷貝建構函式】裡用s定義臨時變數,臨時變數會自動呼叫建構函式開闢空間

然後用swap這個函式交換兩個變數之間的內容

原來的內容在temp,並且出了【拷貝建構函式】就銷毀了,避免了記憶體洩漏

string& operator=(const string& s)

return *this;

}

string& operator=(const string& s)

return *this;

}

string& operator=(string temp)

【賦值運算子過載】裡,也可以用到類似的方法。在第三個方法裡,直接傳入乙個臨時變數,連if判斷都可以省去了

【淺拷貝】只是增加了乙個指標,指向已存在物件的記憶體。

【深拷貝】是增加了乙個指標,並新開闢了一塊空間,讓指標指向這塊新開闢的空間。

【淺拷貝】在多個物件指向一塊空間的時候,釋放乙個空間會導致其他物件所使用的空間也被釋放了,再次釋放便會出現錯誤

String類,淺拷貝,深拷貝

想要使用c 中的類那麼必須要有它的標頭檔案,include 首先來看下面乙個 這個程式很簡單,但是如果有乙個空指標呢?那麼就需要判斷了,並且用預設值把有引數的string和沒有引數的string合併在一起,那這個程式只需要做下面的改變 既然你的建構函式開闢了一段空間,那麼就需要釋放掉,此時就需要析構...

淺拷貝,深拷貝和寫時拷貝(string類)

淺拷貝 淺拷貝 編譯器只是直接將指標的值拷貝過來,結果多個物件共用了一塊記憶體,當乙個物件呼叫了析構函式將這塊記憶體釋放掉之後,另一些物件不知道這塊空間已經還給了系統,再次呼叫析構函式進行釋放時發現已經釋放了,就會造成程式崩潰。所以,在類的成員中有指標型別的成員變數的時候,必須對其寫出顯式的拷貝建構...

C 深拷貝與淺拷貝(實現String類)

所謂淺拷貝,指的是在物件複製時,只是對物件中的資料成員進行簡單的複製,預設拷貝建構函式執行的也是淺拷貝。簡單的說,淺拷貝就是值傳遞,將源空間裡面的內容複製到目標空間中。存在缺陷 多個指標可能共用管理一塊記憶體空間,在釋放時,導致對一塊空間的多次釋放,造成記憶體洩露。在 深拷貝 的情況下,對於物件中動...