深淺拷貝問題 拷貝建構函式

2021-10-10 06:05:41 字數 845 閱讀 1272

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

淺拷貝:簡單的複製拷貝操作

class

person

person

(int age)

`person()

int m_age;

}void

test()

當引數中有堆區引數,改造之後:

class

person

person

(int age,

int height)

`person()

cout<<

"析構函式呼叫"

<}int m_age;

int*m_height;

//身高 用指標是為了開闢到堆區

}void

test()

上面這個**執行完成後,將會報錯,報:物件的初始化和清理。

因為對於age這個屬性,當person p2(p1)時,編譯器會呼叫自己的拷貝建構函式,會做淺拷貝操作,會逐字節的將p1的元素拷貝到p2中。但是在堆區的height屬性,他同樣會將堆區的位址拷貝到p2。當p1和p2執行析構函式時,p2會率先被釋放,當p1釋放時,發現該記憶體已經被釋放過了,自己再操作這塊記憶體就屬於非法操作,淺拷貝帶來的問題就是:堆區的記憶體重複釋放。

解決辦法:

利用深拷貝來解決他。重寫拷貝建構函式,重新在堆區建立空間。

//重寫拷貝建構函式,實現深拷貝

person

(const person &p)

拷貝建構函式 深淺拷貝

為什麼拷貝建構函式必須為引用傳遞,不能是值傳遞 簡單的回答bai是為了防止遞迴引用。du 具體一些zhi可以這麼講 當 乙個dao物件需要zhuan以值方式傳遞時,編譯shu器會生成 呼叫它的拷貝建構函式以生成乙個複本。如果類a的拷貝建構函式是以值方式傳遞乙個類a物件作為引數的話,當 需要呼叫類a的...

拷貝建構函式,預設拷貝建構函式

拷貝建構函式,預設拷貝建構函式 1.c 的預設拷貝建構函式,從深度拷貝和淺拷貝說起 c 類的預設拷貝建構函式的弊端 c 類的中有兩個特殊的建構函式,1 無參建構函式,2 拷貝建構函式。它們的特殊之處在於 1 當類中沒有定義任何建構函式時,編譯器會預設提供乙個無參建構函式且其函式體為空 2 當類中沒有...

拷貝和深淺拷貝

當list2為list的拷貝物件時,list內的可變資料型別變化,list2變化 list內的不可變資料型別變化,list2變化。總之 list變化list2一定變化 list 1,2,3,4,list2 list print list print list2 1,2,3,4,5 1,2,3,4,5...