2 由深拷貝和淺拷貝引發的寫時拷貝技術

2022-04-11 08:02:39 字數 1128 閱讀 1551

一、相關問題

我們知道,淺拷貝會引發重複釋放,導致程式崩潰。而深拷貝雖不會出現上述問題,但是記憶體空間開銷大。所以,有沒有一種方法,

既節省空間,又不會造成程式崩潰呢?

二、寫時拷貝技術

寫時拷貝(copy-on-write):如果有多個呼叫者同時要求相同資源,他們會共同取得相同的指標指向相同的資源,直到某個呼叫者

嘗試修改時,才會複製乙個副本給該呼叫者。

三、例子

實現string類,在string中新增引用計數器類成員 

class

string;

//引用計數器類

class

string_rep

else

}string_rep(string_rep

const&that)

string_rep& operator=(string_rep const&rhs)

return *this

; }

~string_rep()

public

:

void increment()

void

decrement()

}private

:

char*m_data;

intm_usecount;

};class

string

public

: string(

const

char* str = ""

) string(

const string&that)

string& operator=(string const&rhs)

return *this

; }

~string()

public

:

void

toupper()

char* ch = m_rep->m_data;

while (*ch != '\0'

) }

private

: string_rep*m_rep;

};int

main()

執行結果:

深拷貝 淺拷貝 引發的寫時拷貝

從乙個例子說明淺拷貝是什麼 include using namespace std class string else string private char data 當類中的私有資料 有指標 並且如果讓程式預設生成 拷貝構造和 賦值方法 會發生淺拷貝現象 即 void main 預設的拷貝構造 ...

淺拷貝,深拷貝,寫時拷貝

淺拷貝 拷貝構造時複製指標僅僅是對指標的值拷貝,而不開闢新的空間這樣就會造成在析構的時候。會對同一塊記憶體釋放兩次。深拷貝 拷貝構造時會開闢新的記憶體,並把記憶體中的值進行拷貝 寫時拷貝 就是當你在讀取一片空間時,系統並不會為你開闢乙個一模一樣的空間給你 只有在當你真正修改的時候,才會開闢一片空間給...

深拷貝 淺拷貝 寫時拷貝

在拷貝構造的時候,直接將原內容的位址交給要拷貝的類,兩個類共同指向一塊記憶體。缺陷 1 一旦對str2進行操作,str1的內容也會改變 2 析構時先析構str2,再析構str1,但是由於str1,str2指向同一塊記憶體空間,因此會導致對一塊記憶體進行兩次析構而出現錯誤 通過開闢和源空間大小相同的記...