c 深淺拷貝 寫時拷貝實現

2021-08-03 18:54:05 字數 1959 閱讀 1219

淺拷貝:在拷貝構造的時候,直接將原內容的位址交給要拷貝的類,兩個類共同指向一片空間。但是存在很大的缺陷:①一旦對s2進行操作,s1的內容也會改變;②析構時先析構s2,再析構s1,但是由於s1,s2指向同一片空間,會導致一片空間的二次析構導致出錯。

深拷貝:通過開闢和源空間大小相同的空間並將內容拷貝下來再進行操作。不論是否對s2進行操作,都會拷貝一片相同大小的空間以及內容下來。

圖示如下:深拷貝實現如下:

#include 

using

namespace

std;

class string

//傳統寫法,開闢空間

string(const string& s)

//現**法,利用建構函式

//string(const string& s)

// :_str(null)

////****************賦值運算子過載**************

//string& operator=(const string& s)

//// return *this;

//}//****************賦值運算子過載**************

string& operator=(string& s)

//***************析構函式********************

~string()

}private:

char* _str;

};

寫時拷貝:引入乙個計數器,每片不同內容的空間上都再由乙個計數器組成,在構造第乙個類指向時,計數器初始化為1,之後每次有新的類也指向同一片空間時,計數器加價;在析構時判斷該片空間對應計數器是否為1,為1則執行清理工作,大於1則計數器-1。如果有需要進行增刪等操作時,再拷貝空間完成,有利於提高效率。

寫法一:

#include 

using

namespace

std;

class string

string(const string& str)

: _str(str._str)

,_refcount(str._refcount)

~string()

string& operator= (const string& s)

return *this;

}void release()

}private:

char* _str;

int* _refcount;

};

缺點:每構造乙個新類,就會多開四個位元組,會導致空間中有許多的記憶體碎片。

第二種:

class string

string(const string& s)

:_str(s._

str)

~string()

string& operator=(const string& s)

return *this;

}void release()

}int& getcount()

private:

char* _

str;

};

由於計數器存放在了_str首位址-4的位址上,所以在析構時一定要注意全部釋放,避免記憶體洩漏。

圖示如下:

C 淺拷貝 深拷貝 寫時拷貝

淺拷貝 編譯器只是直接將指標的值拷貝過來,結果多個物件共用了一塊記憶體,當乙個物件呼叫了析構函式將這塊記憶體釋放掉之後,另一些物件不知道這塊空間已經還給了系統,再次呼叫析構函式進行釋放時發現已經釋放了,就會造成程式崩潰。在類的成員中有指標型別的成員變數的時候,必須對其寫出顯式的拷貝建構函式和賦值運算...

C 淺拷貝 深拷貝 寫時拷貝

不是拷貝了基本型別的資料,而引用型別資料,複製後也是會發生引用,我們把這種拷貝叫做淺拷貝。換句話說,淺複製僅僅是指向被複製的記憶體位址,如果原位址中物件被改變了,那麼淺複製出來的物件也會相應改變。int main 在計算機中開闢了一塊新的記憶體位址用於存放複製的物件。上述 中p1和p2指向的同一塊記...

c 寫時拷貝

在c 中乙個類有六個預設成員函式,其中拷貝建構函式分為淺拷貝和深拷貝 淺拷貝是一種值拷貝,深拷貝不僅是值拷貝,還要做其他處理 深淺拷貝的區別 由上圖可知當乙個拷貝構造乙個需動態開闢空間的物件時,用淺拷貝時會出現同一塊空間被釋放兩次,這樣顯然有問題,用深拷貝的話可以解決此問題,但當拷貝構造出來的物件,...