C++關於淺複製和深複製
阿新 • • 發佈:2019-02-04
簡單的來說就是,在有指標的情況下,淺拷貝只是增加了一個指標指向已經存在的記憶體,而深拷貝就是增加一個指標並且申請一個新的記憶體,使這個增加的指標指向這個新的記憶體,採用深拷貝的情況下,釋放記憶體的時候就不會出現在淺拷貝時重複釋放同一記憶體的錯誤!
淺複製: 被複制物件的所有變數都含有與原來的物件相同的值,而其所有的對其他物件的引用都仍然指向原來的物件。 補充: 一個物件中的欄位有的是值型別的,有的是引用型別的。對於值型別欄位來說,它的值就是簡單的值,而對於引用型別來說,它的值是地址。 淺複製在複製時,將這個物件的值欄位和引用欄位(均為非靜態欄位)全部複製過去,獲得了這個物件的值和地址。 即:當其中一個物件的引用欄位所指向的地址中的變數變化時,所有淺複製物件中的該引用欄位都會發生變化。 深複製: 被複制物件會將所有非引用型別的欄位複製給新物件,同時將引用型別所指向地址中存的物件複製給新的物件。 區別: 淺複製和深複製的區別僅在於對引用型別的對待上,一個是複製的地址,一個是複製的地址指向位置的資料.
深拷貝好還是淺拷貝好?
如果實行位拷貝,也就是把物件裡的值完全複製給另一個物件,如A=B。這時,如果B中有一個成員變數指標已經申請了記憶體,那A中的那個成員變數也指向同一塊記憶體。這就出現了問題:當B把記憶體釋放了(如:析構),這時A內的指標就是懸垂指標了,出現執行錯誤。