C 實現帶寫時拷貝功能的String類

2021-08-14 15:26:05 字數 1723 閱讀 5331

字串寫時拷貝實現原理:

通過物件的引用計數來減少記憶體的申請開銷,經過拷貝構造或賦值函式得到的所有物件,在還沒有對其中某個某個物件進行修改操作時,都共享乙個物件的記憶體。否則,如果原有物件的引用計數大於1時,將會為修改的物件分配新的記憶體,並在原有的物件引用計數中減一。

成員變數是字元指標型別,字串前四個位元組用來存放當前物件被引用的次數。

class cstring

else

}cstring(const cstring &src)

cstring& operator=(const cstring &src)

mptr = src.mptr;

((int*)mptr)[0]++;

}return *this;

}~cstring()

}void erase(const

char &ch) // 'a'

char *p = mptr + 4;

for (; *p != '\0'; ++p)

*(q - 1) = '\0';

return;}}

}private:

char *mptr;

friend ostream& operator

<<(ostream &out, const cstring& src);

};ostream& operator

<<(ostream &out, const cstring& src)

成員變數型別設定為結構體型別,其中有乙個整型變數專門用來計數,另乙個變數是字元指標型別。

class cstring

cstring(const cstring& src)

cstring& operator=(const cstring& src)

mpnode->cnt--;

if (mpnode->cnt == 0)

mpnode = src.mpnode;

mpnode->cnt++;

return *this;

}~cstring()

}void erase(const

char &ch)

char *p = mpnode->mptr;

int size = strlen(mpnode->mptr) + 1;

for (int i = 0; i < size - 1; ++i)

return;}}

}private:

struct node

else

}int cnt;

char *mptr;

};node *mpnode;

friend ostream& operator

<<(ostream &out, const cstring& src);

};ostream& operator

<<(ostream &out,const cstring &src)

測試:

int main()

vs執行結果:

hello

hello

hllo

hello

hllo

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...