當結構體中沒有指標時,可進行淺拷貝,資料也會從乙個結構體拷貝到另乙個結構體(兩個結構體都存乙份資料)。但當結構體中有指標的時候,假如使用使用淺拷貝,會使兩個結構體使用的指標都指向同乙個記憶體位址,在析構的時候會造成記憶體洩漏。
深拷貝:需要對含有指標的結構體,使用「new ***」申請新的記憶體空間去儲存拷貝的資料
淺拷貝:最簡單的可以直接使用 「=」進行賦值,不涉及到手動申請記憶體空間
有兩個子模組a,b,他們都需要訪問同乙份資料,但是這兩個模組都會對資料進行clear。
資料模組c,將c* data的位址賦值給a模組,則a模組就能直接訪問data的資料位址了。
理論上b也需要使用模組c的資料,但是不能使用同乙份資料,需要進行深拷貝,將同樣的資料存在兩個不同的位址。
class a;
class b;
struct c;
同乙個記憶體的模組c的資料(假如結構體如上),同時被模組a,b訪問;a刪除c.m,b又去訪問c.m,此時記憶體中c的資料m已經被a刪除,並不存在了。b訪問了不存在的位址,即訪問了非法記憶體,因此會造成記憶體洩漏導致程序崩潰。
還有乙個比較有趣的地方:在實機驗證的時候,並不會經常導致程序崩潰;這是因為在實際環境中,不斷的通過socket在向模組c的位址寫入資料,當a刪除了c.m,在b訪問c.m之前,socket收到資料又對c.m進行了賦值,因此b也能正常訪問c.m了。
c* a_c = nullptr;
c* b_c = nullptr;//一定要指定為空,或者在建構函式中初始化為空
c * m_data; //假設有資料
void c::getadata( c *data)
memcpy ( a_c , m_data , sizeof(a_c);
a_c = data;//將指標a_c的位址記憶體,賦值給data;data即為a模組裡面訪問資料的結構體
}void c::getbdata( c *data)
memcpy ( b_c , m_data , sizeof(b_c);
b_c = data;//將指標b_c的位址記憶體,賦值給data;b模組通過data,就能訪問c模組的資料了
}memcpy ( &a_c , &data , sizeof(a_c),假如帶&,就是對位址的拷貝,並不是對位址內資料的拷貝;
若二者都使用 memcpy ( &a_c , &data , sizeof(a_c) , memcpy ( &b_c , &data , sizeof(b_c),則a_c與b_c 以及data 都是共享的同乙個記憶體的位址(即指向同乙個記憶體)
c 深淺拷貝
對於普通型別的物件來說,它們之間的複製是很簡單的,例如 int a 88 int b a 而類物件與普通物件不同,類物件內部結構一般較為複雜,存在各種成員變數。下面看乙個類物件拷貝的簡單例子。執行程式,螢幕輸出100。從以上 的執行結果可以看出,系統為物件b分配了記憶體並完成了與物件a的複製過程。就...
C 什麼是深淺拷貝,深淺拷貝的區別?
淺拷貝 class string string const string s str s.str string operator const string s 返回引用是為了連續的賦值 return this string 防止野指標的出現 str null char str get void st...
《深 淺拷貝解析(C )》
問題 在c 中如果沒有顯式定義拷貝建構函式,編譯系統會生成預設的拷貝建構函式,這種機制方便程式設計師編寫程式的同時也為程式設計師帶來了一些麻煩。當類中含有指標成員變數時,預設的拷貝建構函式會將拷貝函式的指標變數值賦給待拷貝建構函式的指標變數,使兩個指標變數指向同一片空間,物件銷毀時,析構函式就會釋放...