C 深拷貝與淺拷貝

2021-10-17 11:07:58 字數 1592 閱讀 3533

淺拷貝:

簡單的賦值拷貝操作。

深拷貝:

在堆區重新申請空間,進行拷貝操作。

首先我們先寫這樣的一段**:

#include

using

namespace std;

//深拷貝與淺拷貝

class

person

person

(int age,

int height)

~person()

cout <<

"~person的析構函式呼叫"

<< endl;

}int m_age;

int*m_height;

//為什麼要用指標?因為我們要把這個資料開到堆區。};

程式居然執行不了。

為什麼呢?

讓我們看下面這張圖:

執行析構**的時候,由於棧的規則,先進後出,所以p2先被釋放,第一次釋放p2所指的160的位址被釋放,然後開始釋放p1,但是由於剛剛釋放p2時,把p1和p2共同指向160的那個位址釋放了,所以這裡p1再次釋放那塊記憶體就是非法操作了。注意:這裡的if(m_height !=null)是指指標不為空,不是指指標所指的位址不為空。

person p2(p1)

如果利用編譯器提供的拷貝建構函式,會做淺拷貝。

淺拷貝會帶來的問題是:

堆區記憶體重複釋放

現在我們要怎麼解決這個問題呢?

淺拷貝的問題要利用深拷貝進行解決。

**如下:

#include

using

namespace std;

//深拷貝與淺拷貝

class

person

person

(int age,

int height)

//自己實現拷貝建構函式 解決淺拷貝帶來的問題

person

(const person &p)

~person()

cout <<

"~person的析構函式呼叫"

<< endl;

}int m_age;

int*m_height;

//為什麼要用指標?因為我們要把這個資料開到堆區。};

void

test01()

intmain()

接下來請看這張圖:

所以此時釋放p2,p1的時候,所釋放m_height的位址是不一樣的位址,所以就沒有問題了。

總結:如果屬性有在堆區開闢的,一定要自己提供拷貝建構函式,防止淺拷貝帶來的問題。

C 深拷貝 與 淺拷貝

最近在寫一些c 程式,遇到個問題,記憶體會出錯,查了一些材料,終於發現問題所在了,原來碰到了傳說中的深拷貝和淺拷貝問題了,檢視一些材料,現在對這個問題做個總結 在類定義中,預設是淺拷貝,即 位拷貝 用在基本類中或者一些沒有指標的自定義型別中沒有一點問題,但是當遇到含有指標變數的自定義型別的時候,就會...

C 淺拷貝與深拷貝

淺拷貝 shallow copy 指的是當物件的字段被拷貝的時候,字段應用的物件不會被拷貝。深拷貝是對物件例項當中的字段引用的物件也進行拷貝的一種方式。淺拷貝可以通過將類實現介面icloneable class myclass icloneable 舉個簡單的例項 using system usin...

c 深拷貝與淺拷貝

對於普通型別的物件來說,它們之間的複製是很簡單的,例如 int a 88 int b a 而類物件與普通物件不同,類物件內部結構一般較為複雜,存在各種成員變數。下面看乙個類物件拷貝的簡單例子。iostream using namespace std class cexample void show ...