寫時拷貝的實現 針對C 的String類

2021-08-28 09:42:30 字數 1024 閱讀 8780

一、寫時拷貝

fork之後,父子程序共享所有的資料區域,但是核心將這些區域設為唯讀,只有在父子程序中任意乙個程序試圖修改資料(區域性、全域性、堆區)時,核心才會將所要修改的資料所在的頁直接拷貝出來作為屬於子程序的空間(注意不是拷貝所有資料,僅僅拷貝所要修改資料所在的那一頁)。拷貝的內容在.heap段。

所以子程序的資料空間並不是在fork時複製出來的,並且在沒有修改資料之前,子程序和父程序的空間是相同的。

二、寫時拷貝的作用

1、提高了fork的效率

2、fork之後,子程序往往會呼叫exec呼叫新的程序

三、**段

#includeusing namespace std;

class cstring

cstring(const char *str)

cstring(const cstring &src)

cstring& operator=(const cstring &src)

if(--getcount() == 0)//這裡檢查呼叫方的_str空間是否有其他物件共享,若沒有則清空記憶體,防止造成記憶體洩露

_str = src._str;

getcount()++;

return *this;

}~cstring()}/*

這裡就是寫時拷貝的核心

當主函式內試圖要修改程序中某個資料時,先判斷是否有其他對想共享

如果有,則會重新拷貝乙份資料給物件。

*/char &operator(int pos)

return  _str[pos+4];

}private:

int &getcount()

char *_str;

friend ostream& operator<<(ostream& out, const cstring &str);

};//輸出運算子的過載

ostream& operator<<(ostream& out, const cstring &str)

c 深淺拷貝 寫時拷貝實現

淺拷貝 在拷貝構造的時候,直接將原內容的位址交給要拷貝的類,兩個類共同指向一片空間。但是存在很大的缺陷 一旦對s2進行操作,s1的內容也會改變 析構時先析構s2,再析構s1,但是由於s1,s2指向同一片空間,會導致一片空間的二次析構導致出錯。深拷貝 通過開闢和源空間大小相同的空間並將內容拷貝下來再進...

c 寫時拷貝

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

c 寫時拷貝1

class string string const string s ptr new char strlen s.ptr 1 另外開闢空間 string private char ptr void test int end gettickcount 記錄此時毫秒數 string const stri...