淺拷貝 深拷貝的再次理解

2021-08-05 21:06:54 字數 719 閱讀 2912

以前對淺拷貝的認識不夠,認為只是對指標的賦值,沒有真實的開闢空間。看了一篇部落格後感覺自己的認識還不夠,其實淺拷貝還會導致記憶體洩漏!對,你沒看錯,確實是 記憶體洩漏!最後會把部落格鏈結貼出來。

我們以前對淺拷貝深拷貝的理解是這樣的:

淺拷貝是對指標的拷貝,拷貝以後兩個指標指向的是同一塊記憶體空間,

深拷貝是另外開闢一塊空間,兩個指標指向不同的空間,當乙個指標釋放後,另乙個指標照樣可以使用。

然而淺拷貝在乙個指標釋放後,還存在乙個問題就是,這塊空間不能使用了,即記憶體洩漏。

下面貼一段**:

classa

~a()

} private:

char

* _a; };

void

test()

你們可以試驗一下,我執行後會報錯!這是為什麼呢?

我們沒有定義拷貝建構函式,物件b呼叫的是預設的拷貝建構函式,執行的是淺拷貝。程式執行結束物件a析構後,_a指向的空間被釋放。然而b物件的_a還在指向這塊空間,再次delete就會報錯,報錯原因就是對同一塊空間delete兩次。

至此我們無法再操作這塊空間,造成記憶體洩漏!

這裡總結一下淺拷貝會出現的問題:

淺拷貝只是拷貝了乙個指標,兩個指標指向同一塊記憶體,這樣delete兩次後會報錯。

由於兩個指標都指向同乙個記憶體所以,任何乙個指針對記憶體的操作都會影響到另乙個

會造成記憶體洩漏!(絕對的硬傷啊,看你以後還用不)

對深拷貝與淺拷貝的再次理解

記得11年底找工作的時候,面試時曾經遇到有面試官問的對深拷貝與淺拷貝的理解,那時候自己回來查了資料,寫了篇部落格,感覺自己理解了,其實理解的不深刻,最近在除錯 bug的時候,再次遇到深拷貝與淺拷貝,認真分析了,寫寫自己的心得吧。先說下自己的理解吧,淺拷貝,即在定義乙個類a 使用類似 a obj a ...

對深拷貝與淺拷貝的再次理解

先說下自己的理解吧,淺拷貝,即在定義乙個類a 使用類似 a obj a obj1 obj 或者a obj1 obj 時候,由於沒有自定義拷貝建構函式,c 編譯器自動會產生乙個預設的拷貝建構函式。這個預設的拷貝建構函式採用的是 位拷貝 淺拷貝 而非 值拷貝 深拷貝 的方式,如果類中含有指標變數,預設的...

淺拷貝,深拷貝的理解

淺拷貝 淺拷貝是將物件的每個屬性進行依次複製,當物件的屬性值是引用型別,實質複製的是其引用,指向的值改也會跟著變化,淺拷貝只拷貝一層 深拷貝 深拷貝複製變數值,對於非基本型別的變數,則遞迴至基本型別變數後,在複製,深拷貝後的物件與原來的物件是完全隔離的,互不影響,深拷貝是層層拷貝 淺拷貝 操作 簡單...