如何理解深拷貝和淺拷貝

2021-09-20 10:34:56 字數 829 閱讀 2340

首先我們先記住乙個結論:編譯器自動生成的拷貝構造和賦值運算子是memcpy的乙個過程。

例項過程以結構體代替,在c++中struct和class除了預設訪問許可權基本等同。 

struct teststruct1

;int main()

拷貝構造直接將onevar的記憶體空間拷貝到twovar的記憶體空間中。

考慮乙個成員指標的情況:

由此看出onevar和twovar的指標成員共享了onevar.a的堆記憶體空間,如果onevar和twovar其中乙個執行了delete onevar.a或者

delete twovar.a(4這塊記憶體被**了),這個時候另外乙個變數再次從a取值就是產生未定義的行為。

理解「淺拷貝」和「深拷貝」

淺拷貝 將原物件 原陣列 的 引用 直接賦給新物件 新陣列 新物件 新陣列 是原物件 原陣列 的乙個引用。如果改變這個新物件 新陣列 原物件 原陣列 就會改變。深拷貝 將原物件的各項屬性的 值 陣列的所有元素 都拷貝給新物件 新陣列 是拷貝的 值 而不是 引用 為什麼要使用深拷貝?希望改變新物件 新...

c 淺拷貝和深拷貝理解

為什麼c 會設定這兩種拷貝呢,因為在某些情況下,類內成員變數需要動態開闢堆記憶體,如果實行位拷貝,也就是說把物件裡的值完全複製給另乙個物件,如a b。這時,如果b中有乙個成員變數指標已經申請了記憶體,那麼a中的那個成員變數也指向同一塊記憶體。這就出現了問題 當b把記憶體釋放了 析構 這時a記憶體就成...

深拷貝和淺拷貝的理解

為什麼要使用深拷貝和淺拷貝?當你想複製乙個物件時,一般做法是obj2 obj1,但是當你改動obj2的時候,會影響到obj1,而obj1也會影響到obj2,所以需要深拷貝和淺拷貝來解決物件的直接賦值仍然 連線 的問題。淺拷貝 複製乙份引用,讓所有引用物件指向乙份資料,並且可以修改這份資料,即只對指標...