淺拷貝,深拷貝,寫時拷貝

2021-09-26 09:06:39 字數 918 閱讀 7019

思想:我們用指標p申請了一塊記憶體空間,在用指標q指向了這一片記憶體空間,這時候這兩個指標指向的是同乙個記憶體空間,當需要釋放這塊記憶體空間的時候p會釋放一次,q也會釋放一次,這樣重複釋放就會引發程式的崩潰。

我們通過一段**來理解淺拷貝

class person	}	

};void test()

int main()

這一段**的看起來沒事,編譯器也不會報錯,但是當你執行的時候程式會崩潰,這一段**就是因為淺拷貝而出現奔潰的。這段**只有在例項化p1的時候去申請了1000個位元組空間,然後給p1的name和age例項化,**到這裡沒有任何問題;在往下走,用p1來拷貝構造p2,但是p2沒有申請記憶體空間,只是將p2的name的指標指向了p1的那段記憶體空間,這段也沒有錯;問題出在呼叫析構函式的時候,因為p1的name和p2的那麼的記憶體空間指向了同一片記憶體空間,所以p1釋放的時候不會出錯,但是p2也會釋放自己的記憶體空間,這就會重複的釋放,大家都知道,多次釋放同一片記憶體空間程式會崩潰,這就是問題所在了。要想解決這個問題,那麼我們就用到了深拷貝。

思想:我們用物件p申請一塊記憶體空間,然後我們用物件p來構造我們的物件q,這個時候我們需要給物件q也申請一塊記憶體空間,然後將p物件裡裡面的值拷貝到物件q中,在釋放他們的時候各自釋放的都是各自的空間,這樣程式也就不會像淺拷貝一樣發生崩潰了。

下面我們看一下深拷貝的**

class person

person(const person& per)

~person() }

};int main()

當需要例項化大量物件的時候,如果你每乙個都執行深拷貝,這樣就程式一直開闢的記憶體空間,會造成大量的空間浪費,所以我們就用到了寫時拷貝,當你需要對用到的物件程序操作的時候,對該物件開闢記憶體空間,進行深拷貝,會節省很多的空間。

淺拷貝,深拷貝,寫時拷貝

淺拷貝 拷貝構造時複製指標僅僅是對指標的值拷貝,而不開闢新的空間這樣就會造成在析構的時候。會對同一塊記憶體釋放兩次。深拷貝 拷貝構造時會開闢新的記憶體,並把記憶體中的值進行拷貝 寫時拷貝 就是當你在讀取一片空間時,系統並不會為你開闢乙個一模一樣的空間給你 只有在當你真正修改的時候,才會開闢一片空間給...

深拷貝 淺拷貝 寫時拷貝

在拷貝構造的時候,直接將原內容的位址交給要拷貝的類,兩個類共同指向一塊記憶體。缺陷 1 一旦對str2進行操作,str1的內容也會改變 2 析構時先析構str2,再析構str1,但是由於str1,str2指向同一塊記憶體空間,因此會導致對一塊記憶體進行兩次析構而出現錯誤 通過開闢和源空間大小相同的記...

C 淺拷貝 深拷貝 寫時拷貝

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