一、概念字面理解
1、淺拷貝:發生物件複製時,只是對對像張資料成員進行簡單的賦值。涉及到動態分配問題,如果按淺拷貝進行複製,不做特殊處理,複製完成後,兩個物件中涉及動態分配空間的變數,不管他們各自的空間,及空間中的內容都是完全一樣的,當對這兩個物件進行析構時,會發生同一片空間被釋放兩次,因而會出現錯誤。
如指標,淺拷貝只是對指標進行複製,複製完成後,兩個指標指向同乙個記憶體空間,而深拷貝不止對指標進行複製,也對指標指向的內容進行複製,深拷貝後,兩個指標指向不同位址的記憶體空間,但內容相同。
淺拷貝可能存在的問題(均是指存在動態分配或者指標變數的情況下):
(1)析構時,同乙個記憶體空間可能會被釋放兩次,這是錯誤的;
(2)經淺拷貝後,指向同乙個記憶體空間,任何一方變動都會影響到另一方;
(3)假如類存在char *ch,class_name obj1(obj),因為obj.ch和obj1.ch指向同乙個記憶體空間,當delete obj.ch,delete.obj.ch記憶體被釋放後,obj1.ch所指的空間不能在被利用了,delete.obj1.ch也不會成功,也會導致一直無法操作該空間,因而會導致記憶體洩漏。結論:在釋放時,會因為obj1.ch的記憶體沒有被釋放,造成記憶體洩漏。
eg:class
rect
~rect() // 析構函式,釋放動態分配的空間
} private
: int
width;
intheight;
int*p;
// 一指標成員
};
intmain()
說明:類rect中有動態分配存在;
rect1複製給rect2,在line23會隱式呼叫預設拷貝建構函式,淺拷貝,只是物件資料成員的賦值操作,此時,rect1.p和rect2.p不僅值相同,而且指向同一片空間,因此在程式執行完成前,及在進行析構時會發生錯誤:同一片位址空間被釋放兩次;
改進方法是採用深拷貝:
eg:class
rect
rect(const
rect& r)
~rect() // 析構函式,釋放動態分配的空間
} private
: int
width;
intheight;
int*p;
// 一指標成員
};2、深拷貝
3、物件複製
4、物件的賦值
5、預設拷貝建構函式、自定義拷貝建構函式
其他:(1)宣告乙個私有的拷貝建構函式,可以防止預設拷貝發生。如果試圖呼叫
a b(a);
就呼叫了私有的拷貝建構函式,編譯器會報錯。
(2)乙個類中可以存在多個拷貝建構函式。(const拷貝和非const拷貝)
eg:calss a
複製物件 和 淺拷貝,深拷貝
複製物件顧名思義,複製乙個物件作為副本,它會開闢一塊新的記憶體 堆記憶體 來儲存副本物件,就像複製檔案一樣.既源物件和副本物件是兩塊不同的記憶體區域.物件具備複製功能,必須實現 協議協議 常用的可複製物件有,nsnumber,nsstring,nsarray,nsdictionary,nsmutab...
JS物件複製 深拷貝 淺拷貝
在本文中,我們將從淺拷貝 shallow copy 和深拷貝 deep copy 兩個方面,介紹多種 js 中複製物件的方法。var foo console.log foo.a abc var bar foo console.log bar.a abc foo.a yo foo console.lo...
C 類物件的複製 拷貝建構函式 深拷貝,淺拷貝
c 類物件的複製 拷貝建構函式 深拷貝,淺拷貝 進一步理解類成員的操作!站點 www.ev lab.com include using namespacestd classtest protected intp1 void main 普通物件和類物件同為物件,他們之間的特性有相似之處也有不同之處,類...