深拷貝和淺拷貝(一)

2021-09-01 11:31:20 字數 1269 閱讀 4535

1. 淺拷貝

所謂淺拷貝,指的是在物件複製時,只對物件的資料成員進行複製,但是遇到有動態成員如指標時就會出問題。

[c-sharp]view plain

copy

classrect  

~rect()     // 析構函式,釋放動態分配的空間

}  private:  

intwidth;  

intheight;  

int*p;     // 一指標成員

};  

intmain()  

在這段**執行結束之前,會出現乙個執行錯誤。原因就在於在進行物件複製時,對於動態分配的內容沒有進行正確的操作。我們來分析一下:

在執行定義rect1物件後,由於在建構函式中有乙個動態分配的語句,因此執行後的記憶體情況大致如下:

在使用rect1複製rect2時,由於執行的是淺拷貝,只是將成員的值進行賦值,這時 rect1.p= rect2.p,也即這兩個指標指向了堆裡的同乙個空間,如下圖所示:

在銷毀物件時,兩個物件的析構函式將對同乙個記憶體空間釋放兩次。我們需要的不是兩個p有相同的值,而是兩個p指向的空間有相同的值,解決辦法就是使用「深拷貝」。

3. 深拷貝

在「深拷貝」的情況下,對於物件中動態成員,就不能僅僅簡單地賦值了,而應該重新動態分配空間,如上面的例子就應該按照如下的方式進行處理:

[c-sharp]view plain

copy

classrect  

rect(constrect& r)  

~rect()     // 析構函式,釋放動態分配的空間

}  private:  

intwidth;  

intheight;  

int*p;     // 一指標成員

};  

此時,在完成物件的複製後,記憶體的乙個大致情況如下:

此時rect1的p和rect2的p各自指向一段記憶體空間,但它們指向的空間具有相同的內容,這就是所謂的「深拷貝」。

深拷貝和淺拷貝

淺拷貝就是物件的資料成員之間的簡單賦值,如你設計了乙個沒有類而沒有提供它的複製建構函式,當用該類的乙個物件去給令乙個物件賦值時所執行的過程就是淺拷貝,如 class a a private int data int main 這一句b a 就是淺拷貝,執行完這句後b.data 5 如果物件中沒有其他...

淺拷貝和深拷貝

以下情況都會呼叫拷貝建構函式 乙個物件以值傳遞的方式傳入函式體 例如 已知class a,class b void func a a void func a a func b b 此時函式對b的操作是呼叫拷貝建構函式後的臨時拷貝物件。多數傳指標 乙個物件以值傳遞的方式從函式返回 如 return b...

深拷貝和淺拷貝

ios提供了copy和mutablecopy方法,顧名思義,copy就是複製了乙個imutable的物件,而mutablecopy就是複製了乙個mutable的物件。以下將舉幾個例子來說明。1 系統的非容器類物件 這裡指的是nsstring nsnumber等等一類的物件。nsstring stri...