class string
string(const string& s)
:_ptr(new
char[strlen(s._ptr)+1])//另外開闢空間
~string()
}private:
char* _ptr;
};
void test()
int end = gettickcount();//記錄此時毫秒數
string(const string& s) //拷貝建構函式
:_ptr(s._ptr)
, _retcount(s._retcount)
string& operator= (const string& s) //賦值運算子過載
_ptr = s._ptr;//改變this的指向,並增加引用計數
方案三:是每個物件對應乙個整型空間(即_refcount)存放指向這塊空間的物件個數
再優化:不引用_refcount,但每次給_ptr開闢空間的時候,多開闢四個位元組,用來記錄指向此空間的物件個數,規定用開頭那四個位元組來計數。
對下列函式進行解析:
char& operator (size_t index)
}
當在主函式中執行語句:s1[0] = 『w』;時,想要改變s1物件中_ptr[0]的值;但是當我們改變s1中_ptr[0]的值時,不希望把s2、s3中_ptr[0]的值也改變了。由於s1、s2、s3目前指向同一塊空間,改變其中乙個,另外兩個肯定也跟著改變了,所以提供了另外一種方法:把物件s1分離出來,舊引用計數減1,另外給s1開闢一段跟原來一樣的空間,存放一樣的內容,這時候即使改變了s1的內容,也不影響s2、s3的對容。
一樣看下圖說話:
c 寫時拷貝
在c 中乙個類有六個預設成員函式,其中拷貝建構函式分為淺拷貝和深拷貝 淺拷貝是一種值拷貝,深拷貝不僅是值拷貝,還要做其他處理 深淺拷貝的區別 由上圖可知當乙個拷貝構造乙個需動態開闢空間的物件時,用淺拷貝時會出現同一塊空間被釋放兩次,這樣顯然有問題,用深拷貝的話可以解決此問題,但當拷貝構造出來的物件,...
C 寫時拷貝技術
寫時拷貝 就是在寫的時候 修改字串的時 才會進行真正的空間分配,在唯讀的情況下,資料進行淺拷貝。寫時拷貝技術就是引用計數器的淺拷貝,是通過 引用計數 實現的,在分配空間的時候多分配4個位元組,用來記錄有多少個指標指向這塊空間。當有新的指標指向這塊空間時,引用計數加1 當要釋放這塊空間時,僅引用計數減...
C 淺拷貝 深拷貝 寫時拷貝
淺拷貝 編譯器只是直接將指標的值拷貝過來,結果多個物件共用了一塊記憶體,當乙個物件呼叫了析構函式將這塊記憶體釋放掉之後,另一些物件不知道這塊空間已經還給了系統,再次呼叫析構函式進行釋放時發現已經釋放了,就會造成程式崩潰。在類的成員中有指標型別的成員變數的時候,必須對其寫出顯式的拷貝建構函式和賦值運算...