再議深拷貝與淺拷貝

2021-07-30 01:57:19 字數 983 閱讀 6863

早在博文《淺拷貝和深拷貝的區別?》一文中就講到要特別注意類中含有指標資料成員的情況,在對類進行拷貝操作時,如果沒有在類中自己定義拷貝建構函式,編譯器會自動呼叫預設拷貝建構函式,即把某個物件的資料成員簡單的複製給另乙個物件,如果類含有指標資料成員,這種簡單的淺拷貝會導致兩個物件的指標資料成員都指向同一片記憶體,只要其中乙個物件操作該片記憶體,另乙個物件也會隨之改變。

有以下三種情況會自動呼叫預設拷貝建構函式:

1、在類中新建乙個拷貝物件,有類名 物件2(物件1)類名 物件2 = 物件1兩種形式。

2、當函式引數為類的物件時,即上題出現的情況。

3、當函式的返回值是類的物件時,此時也需要將函式中的物件複製給乙個臨時物件並傳給該函式的呼叫處。

為什麼要特別注意這三種情況呢?因為程式結束時會呼叫兩次析構函式,在上一題中sayhello函式在傳入物件b時首先會進行淺拷貝操作,即:

b(const b& ths)

臨時物件在函式呼叫結束時會呼叫一次析構函式,整個程式結束時(物件b銷毀)又會呼叫一次析構函式,即對指標p進行兩次delete操作,重複銷毀指標p會導致記憶體洩漏、程式崩潰。

所以,怎樣解決淺拷貝類指標資料成員

導致的記憶體洩漏呢?——自己定義拷貝建構函式,為每個指標資料成員分配不同的記憶體空間,即深拷貝。

具體到題目:

class a

;class b

~b()

b(const b& newb) };

void sayhello(b b)

{}int main(void)

「淺拷貝」與「深拷貝」

c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...

淺拷貝與深拷貝

淺拷貝 1 2 myclass a,b a b 為了封裝性和解耦,同型別的兩個物件之間進行賦值操作時,所有成員變數被複製,包括私有成員 指標變數。類的成員函式在傳遞或返回物件時都會進行物件複製產生臨時物件,比如函式呼叫時實參變為形參,以及函式返回物件。考慮到效能和使用者要求不同,編譯器不複製物件內部...

「淺拷貝」與「深拷貝」

c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...