string类的写时拷贝
生活随笔
收集整理的這篇文章主要介紹了
string类的写时拷贝
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
由于淺拷貝使多個(gè)對象共用一塊內(nèi)存地址,調(diào)用析構(gòu)函數(shù)時(shí)導(dǎo)致一塊內(nèi)存被多次釋放,導(dǎo)致程序奔潰。
實(shí)現(xiàn)string類的時(shí)候通常顯示的定義拷貝構(gòu)造函數(shù)和運(yùn)算符重載函數(shù)。
?
由于釋放內(nèi)存空間,開辟內(nèi)存空間時(shí)花費(fèi)時(shí)間,因此,在我們在不需要寫,只是讀的時(shí)候就可以不用新開辟內(nèi)存空間,就用淺拷貝的方式創(chuàng)建對象,當(dāng)我們需要寫的時(shí)候才去新開辟內(nèi)存空間。這種方法就是寫時(shí)拷貝。?
在構(gòu)造函數(shù)中開辟新的空間時(shí)多開辟4個(gè)字節(jié)的空間,用來存放引用計(jì)數(shù)器,記錄這快空間的引用次數(shù)。
[cpp] view plaincopy?
?
==============》
?
將_pCount與_str所指向的空間放在一起,即只用new開辟一次空間
?
class String {friend ostream& operator<<(ostream& os,String& s); public:String(const char*str = ""):_str(new char[strlen(str)+1+4]){*(int *)_str = 1; //*_pCount = 1_str = _str+4; //找到數(shù)據(jù)存放的位置strcpy(_str,str);GetCount() = 1;}String(const String& str):_str(str._str){++GetCount();}~String(){if(--GetCount() == 0){delete[] (_str-4);}}String& operator=(const String& s){if (this != &s){if (--GetCount() == 0){delete[] (_str-4); }++GetCount();_str = s._str;}return *this;} private:int& GetCount() //獲得_pCount{return *((int *)_str-1);} private:char *_str; }; ostream& operator<<(ostream& os,String& s) {os<<s._str;return os; } void test1() {String str1("abcde");String str2(str1);String str3;str3 = str2;cout<<str1<<endl;cout<<str2<<endl;cout<<str3<<endl; }總結(jié)
以上是生活随笔為你收集整理的string类的写时拷贝的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos: firewalld 一
- 下一篇: python colorama模块