簡單來說,淺拷貝就是在有指標的情況下,拷貝該指標,得到的新指標與原指標指向同一塊記憶體;而深拷貝就是拷貝該指標,並申請一塊新記憶體,使得新指標指向該新記憶體
採用深拷貝時不會出現在淺拷貝時重複釋放指標造成記憶體洩漏的情況!!!
以乙個簡單的例子來說明:
#ifndef student_h
#define student_h
#include
class student
;#endif
/*student_h*/
#include
#include
"student.h"
using namespace std;
student:
:student()
student::~
student()
#include
#include
"student.h"
using namespace std;
intmain()
在ubuntu下執行得到結果:
從上述結果可以get,呼叫建構函式只呼叫了一次,在delete name指標時析構了兩次,而兩個name指標指向相同的記憶體,這就是淺拷貝,會造成記憶體洩漏
(在前乙個指標被析構時,記憶體已被釋放,後續指標指向為空,造成記憶體洩漏)!!!
next
我們可以新增乙個建構函式使之實現深拷貝:
#ifndef student_h
#define student_h
#include
class student
;#endif
/*student_h*/
#include
#include
#include
"student.h"
using namespace std;
student:
:student()
student::~
student()
student:
:student
(const student& a)
可以get,在構造時呼叫了自定義的建構函式,然後delete指標時呼叫了兩次析構,從指標位址可以得出兩個指標指向不同的記憶體,這樣就不會造成記憶體洩漏,實現了深拷貝!
再次總結一下:淺拷貝只是對指標的簡單拷貝,實際指向同乙個記憶體;而深拷貝不僅拷貝指標,而且申請一塊新空間給新指標,兩個指標指向不同的記憶體
next
還有其餘兩種情形需要考慮呼叫拷貝建構函式:
當物件被當做引數交給某個函式時
當函式傳回以乙個類物件時
-----------------------------------get到知識點----------------------------------------------
linux下c++多檔案的編譯
淺拷貝與深拷貝
輸出乙個char指標,用(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...