string類的寫時拷貝

2021-09-22 06:28:00 字數 1350 閱讀 3759

由於淺拷貝使多個物件共用一塊記憶體位址,呼叫析構函式時導致一塊記憶體被多次釋放,導致程式奔潰。

實現string類的時候通常顯示的定義拷貝建構函式和運算子過載函式。

由於釋放記憶體空間,開闢記憶體空間時花費時間,因此,在我們在不需要寫,只是讀的時候就可以不用新開闢記憶體空間,就用淺拷貝的方式建立物件,當我們需要寫的時候才去新開闢記憶體空間。這種方法就是寫時拷貝。 

在建構函式中開闢新的空間時多開闢4個位元組的空間,用來存放引用計數器,記錄這快空間的引用次數。

[cpp]view plain

copy

#include

#include

using namespace std;  

class string  

~string()  

}  string(const string& str)  

string& operator=(const string& str)  

return *this;  

}  char& operator(int index)//寫時拷貝  

return _str[index];  

}  friend ostream& operator<

private:  

int& _getrefcount()  

void _release()  

}  private:  

char *_str;  

}; 

**********====》

將_pcount與_str所指向的空間放在一起,即只用new開闢一次空間

int& getcount() //獲得_pcount

private:

char *_str;

};ostream& operator<

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

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

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

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

string的寫時拷貝分析

在本機器上呼叫sizeof string 的時候,答案為4 於是好奇之 typedef basic string string a string looks like this code rep m length basic string m capacity m dataplus m refcou...