淺複製:也就是在物件複製時,只是對物件中的資料成員進行簡單的賦值,如果物件中存在動態成員,即指標,淺複製就會出現問題。
深複製:對於深複製,針對成員變數存在指標的情況,不僅僅是簡單的指標賦值,而是重新分配記憶體空間。
淺複製,即在定義一個類A,使用類似Aobj;Aobj1(obj);或者Aobj1=obj;時候,由於沒有自定義複製建構函式,C++編譯器自動會產生一個預設的複製建構函式。
這個預設的複製建構函式採用的是“位複製”(淺複製),而非“值複製”(深複製)的方式,如果類中含有指標變數,預設的複製建構函式必定出錯。
用一句簡單的話來說就是淺複製只是對指標的複製,複製後兩個指標指向同一個記憶體空間,深複製不但對指標進行複製,而且對指標指向的內容進行複製,經深複製後的指標是指向兩個不同地址的指標。
假如有一個成員變數的指標,char*m_data;
其一,淺複製只是複製了指標,使得兩個指標指向同一個地址,這樣在物件塊結束,呼叫函式析構的時,會造成同一份資源析構2次,即delete同一塊記憶體2次,造成程式崩潰。
其二,淺複製使得obj.m_data和obj1.m_data指向同一塊記憶體,任何一方的變動都會影響到另一方。
其三,在釋放記憶體的時候,會造成obj1.m_data原有的記憶體沒有被釋放,造成記憶體洩露。
事實是這樣的,當deleteobj.m_data,obj.m_data記憶體被釋放後,由於之前obj.m_data和obj1.m_data指向的是同一個記憶體空間,obj1.m_data所指的空間不能在被利用了,deleteobj1.m_data也不會成功,一致已經無法操作該空間,所以導致記憶體洩露。
深複製採用了在堆記憶體中申請新的空間來儲存資料,這樣每個可以避免指標懸掛。
可以看到在複製建構函式中為成員變數申請了新的記憶體空間,這就使得兩個物件的成員變數不指向同一個記憶體空間,除非你的確需要這樣做,用於實現一些其他的用途。
淺複製:也就是在物件複製時,只是對物件中的資料成員進行簡單的賦值,如果物件中存在動態成員,即指標,淺複製就會出現問題。
深複製:對於深複製,針對成員變數存在指標的情況,不僅僅是簡單的指標賦值,而是重新分配記憶體空間。
淺複製,即在定義一個類A,使用類似Aobj;Aobj1(obj);或者Aobj1=obj;時候,由於沒有自定義複製建構函式,C++編譯器自動會產生一個預設的複製建構函式。
這個預設的複製建構函式採用的是“位複製”(淺複製),而非“值複製”(深複製)的方式,如果類中含有指標變數,預設的複製建構函式必定出錯。
用一句簡單的話來說就是淺複製只是對指標的複製,複製後兩個指標指向同一個記憶體空間,深複製不但對指標進行複製,而且對指標指向的內容進行複製,經深複製後的指標是指向兩個不同地址的指標。
假如有一個成員變數的指標,char*m_data;
其一,淺複製只是複製了指標,使得兩個指標指向同一個地址,這樣在物件塊結束,呼叫函式析構的時,會造成同一份資源析構2次,即delete同一塊記憶體2次,造成程式崩潰。
其二,淺複製使得obj.m_data和obj1.m_data指向同一塊記憶體,任何一方的變動都會影響到另一方。
其三,在釋放記憶體的時候,會造成obj1.m_data原有的記憶體沒有被釋放,造成記憶體洩露。
事實是這樣的,當deleteobj.m_data,obj.m_data記憶體被釋放後,由於之前obj.m_data和obj1.m_data指向的是同一個記憶體空間,obj1.m_data所指的空間不能在被利用了,deleteobj1.m_data也不會成功,一致已經無法操作該空間,所以導致記憶體洩露。
深複製採用了在堆記憶體中申請新的空間來儲存資料,這樣每個可以避免指標懸掛。
可以看到在複製建構函式中為成員變數申請了新的記憶體空間,這就使得兩個物件的成員變數不指向同一個記憶體空間,除非你的確需要這樣做,用於實現一些其他的用途。