字串寫時拷貝實現原理:
通過物件的引用計數來減少記憶體的申請開銷,經過拷貝構造或賦值函式得到的所有物件,在還沒有對其中某個某個物件進行修改操作時,都共享乙個物件的記憶體。否則,如果原有物件的引用計數大於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...