C++淺拷貝和深拷貝
????????深拷貝和淺拷貝可以簡答理解為:如果一個類擁有資源沈矿,當這個類的對象發(fā)生復制過程的時候移斩,資源重新分配肚医,這個過程就是深拷貝,反之向瓷,沒有重新分配資源肠套,就是淺拷貝。
淺拷貝:
????????在對象復制時风罩,只是對對象中的數(shù)據(jù)成員進行簡單的賦值糠排。
????????大多情況下淺拷貝已經能很好地工作了,但是如果要復制的數(shù)據(jù)除了屬性值本身外超升,還有附加在屬性值上的額外內容入宦,那么淺拷貝就會出問題了。
? ? ? ? 例如室琢,在某些情況下乾闰,類內成員變量需要通過new動態(tài)開辟內存空間,如果把對象里的值完全復制給另一個對象盈滴,即A=B涯肩。這時,假如B中有一個成員變量指針已經申請了內存巢钓,則A中的那個成員變量也指向了同一塊內存病苗。這時,就出現(xiàn)了問題:當B把內存釋放了(如析構)症汹,A內的指針就是野指針了硫朦,出現(xiàn)運行錯誤。
? ? ? ? 在淺拷貝時背镇,只是將成員的值進行賦值咬展,也即將兩個指針指向了同一個空間。在銷毀對象時瞒斩,兩個對象的析構函數(shù)將對同一個內存空間釋放兩次破婆,這就是錯誤出現(xiàn)的原因。程序需要的不是兩個p有相同的值胸囱,而是兩個p指向的空間有相同的值祷舀,解決辦法就是使用“深拷貝”。
深拷貝:
????????在深拷貝的情況下,對于對象中動態(tài)成員蔑鹦,就不能僅僅簡單地賦值了夺克,而應該重新動態(tài)分配空間箕宙。
? ? ? ? 在完成對象的復制后嚎朽,兩個指針各自指向不同的內存空間,但它們指向的空間具有相同的內容柬帕,這就是深拷貝哟忍。