先考慮一種情況,對乙個已知物件進行拷貝,編譯系統會自動呼叫一種建構函式——拷貝建構函式,如果使用者未定義拷貝建構函式,則會呼叫預設拷貝建構函式。
class="cnblogs_code">
//main.cpp
#include
#include
"student.h
"int
main()
//student.h
#ifndef student_h
#define student_h
class
student
;#endif
//執行結果:呼叫一次建構函式,呼叫兩次析構函式,兩個物件的指標成員所指記憶體相同,這會導致什麼問題呢?student.cpp
#include
"student.h
"#include
using
namespace
std;
student::student()
student::~student()
name指標被分配一次記憶體,但是程式結束時該記憶體卻被釋放了兩次,會造成記憶體洩漏問題!
這是由於編譯系統在我們沒有自己定義拷貝建構函式時,會在拷貝物件時呼叫預設拷貝建構函式,進行的是淺拷貝!即對指標name拷貝後會出現兩個指標指向同乙個記憶體空間。
所以,在對含有指標成員的物件進行拷貝時,必須要自己定義拷貝建構函式,使拷貝後的物件指標成員有自己的記憶體空間,即進行深拷貝,這樣就避免了記憶體洩漏發生。
自己定義拷貝建構函式:
#ifndef student_h
#define student_h
class student
;#endif
//執行結果:呼叫一次建構函式,一次自定義拷貝建構函式,兩次析構函式。兩個物件的指標成員所指記憶體不同。student.cpp
#include
"student.h
"#include
#include
using
namespace
std;
student::student()
student::~student()
student::student(
const student &s)
總結:淺拷貝只是對指標的拷貝,拷貝後兩個指標指向同乙個記憶體空間,深拷貝不但對指標進行拷貝,而且對指標指向的內容進行拷貝,經深拷貝後的指標是指向兩個不同位址的指標。
再說幾句:
當物件中存在指標成員時,除了在複製物件時需要考慮自定義拷貝建構函式,還應該考慮以下兩種情形:
1.當函式的引數為物件時,實參傳遞給形參的實際上是實參的乙個拷貝物件,系統自動通過拷貝建構函式實現;
2.當函式的返回值為乙個物件時,該物件實際上是函式內物件的乙個拷貝,用於返回函式呼叫處。
最後再留乙個問題:物件的複製和賦值有什麼區別?各自的應用場景是怎麼樣的?
本文參考:
《c++程式設計-譚浩強》
深拷貝和淺拷貝的區別
retain屬性表示兩個物件位址相同 建立乙個指標,指標拷貝 內容當然相同,這個物件的retain值 1也就是說,retain 是指標拷貝 淺拷貝 copy 是內容拷貝 深拷貝 ios中並不是所有的物件都支援copy,mutablecopy,遵守nscopying 協議的類可以傳送copy訊息,遵守...
深拷貝和淺拷貝的區別
一.深拷貝 源物件和副本物件是不同的兩個物件 源物件引用計數不變,副本物件計數器為1 因為是新產生的 至少有一層是物件複製 二.淺拷貝 源物件和副本物件是同乙個物件 源物件 副本物件 引用計數器 1,相當於做一次retain操作 本質 沒有產生新的物件 三.完全複製 對於被複製的物件每一層都是物件複...
深拷貝和淺拷貝的區別
深淺拷貝的區別 淺拷貝是將原始物件中的資料型字段拷貝到新物件中去,將引用型字段的 引用 複製到新物件中去,不把 引用的物件 複製進去,所以原始物件和新物件引用同一物件,新物件中的引用型字段發生變化會導致原始物件中的對應欄位也發生變化。深拷貝是在引用方面不同,深拷貝就是建立乙個新的和原始欄位的內容相同...