c String類的寫時拷貝

2021-09-25 15:31:48 字數 1074 閱讀 7089

在學習寫時拷貝前,我們先看乙個例子

class string

~string()

private:

char* mptr;

};int main()

這段**中僅實現了建構函式和析構函式,在構造str1和str2時都開闢了新的記憶體空間,但對於str2,僅是單純的使用了它,並沒有對這塊空間進行操作,所以在這裡給str2重新開闢空間就會顯得有點浪費。而若是需要修改這塊空間的內容時,我們再給它分配一塊空間。便會減少資源的浪費,這種方法的引入便是寫時拷貝。

寫時拷貝:就是在寫的時候(即改變字串時)才會真正的開闢空間拷貝(深拷貝),如果只是對資料的讀時,只會對資料進行淺拷貝。而寫時拷貝是通過「引用計數器」來實現的。

寫時拷貝的實現:在分配空間的時候多分配4個位元組,用來記錄有多少個指標指向這塊空間,當有新的指標指向這塊空間時,引用計數加一,當要釋放這塊空間時,引用計數減一(假裝釋放),直到引用計數減為0時才真的釋放掉這塊空間。當有指標要改變這塊空間的值時,再為這個指標分配自己的空間(注意這時引用計數的變化,舊的空間的引用計數減一,新分配的空間引用計數加一)。

如圖所示:

**實現:

class string

string(const string& rhs)

string& operator=(const string& rhs)

mptr = rhs.mptr;

getref()++;

} return *this;

} ~string()

mptr = null;

} char& operator(int index)

return mptr[index];

}private:

int& getref()

char* mptr;

};int main()

string類的寫時拷貝

由於淺拷貝使多個物件共用一塊記憶體位址,呼叫析構函式時導致一塊記憶體被多次釋放,導致程式奔潰。實現string類的時候通常顯示的定義拷貝建構函式和運算子過載函式。由於釋放記憶體空間,開闢記憶體空間時花費時間,因此,在我們在不需要寫,只是讀的時候就可以不用新開闢記憶體空間,就用淺拷貝的方式建立物件,當...

String類 (淺拷貝 深拷貝 寫時拷貝)

淺拷貝是指當物件的字段值被拷貝時,字段引用的物件不會被拷貝。例如,如果乙個物件有乙個指向字串的字段,並且我們對該物件做了乙個淺拷貝,那麼兩個物件將引用同乙個字串。存在問題 如果源程式中沒有顯示定義拷貝建構函式,在進行物件的拷貝時,將呼叫系統預設的拷貝建構函式,這就使得兩個物件指向了同一資源,而析構函...

淺拷貝,深拷貝和寫時拷貝(string類)

淺拷貝 淺拷貝 編譯器只是直接將指標的值拷貝過來,結果多個物件共用了一塊記憶體,當乙個物件呼叫了析構函式將這塊記憶體釋放掉之後,另一些物件不知道這塊空間已經還給了系統,再次呼叫析構函式進行釋放時發現已經釋放了,就會造成程式崩潰。所以,在類的成員中有指標型別的成員變數的時候,必須對其寫出顯式的拷貝建構...