您好,登錄后才能下訂單哦!
string類的深淺拷貝,寫時拷貝
淺拷貝:多個指針指向同一塊空間,多次析構同一塊內存空間,系統會崩潰。(淺拷貝就是值拷貝)
深拷貝:給指針開辟新的空間,把內容拷貝進去,每個指針都指向自己的內存空間,析構時不會內存崩潰。
#include <iostream> #include <string> using namespace std; class String { public: String(const char*str) :_str(new char [strlen(str)+1]) { strcpy(_str,str); } //String(const String& str) //淺拷貝 // :_str(str._str) // {} //String &operator=(const String& str) //{ // if(this!= &str) // { // _str = str._str; // } // return *this; //} String(const String& str) //深拷貝 :_str(new char[strlen(str._str)+1]) { strcpy(_str,str._str); } String &operator=(const String& str) { if(this!=&str) { //delete[] _str; //_str=new char [strlen(str._str)+1]; //strcpy(_str,str._str); _str=str._str; } return *this; } ~String() { if(_str) { cout<<"~String()"<<endl; delete[] _str; } } private: char*_str; }; void TestString() { String s1("hello world!"); String s2=s1;//s2(s1) } int main() { TestString(); return 0; }
寫時拷貝:會存在一個計數器,并且多個對象指向同一塊空間,每次創建一個新的對象時計數器加++,銷毀時計數器--,直到計數器count=0時析構。
class String { public: String(const char*str) :_str(new char [strlen(str)+1]) ,_count(1) { strcpy(_str,str); } String(const String& str) :_str(str._str) { _count++; } String &operator=(const String& str) { if(this!= &str) { _str = str._str; } return *this; } ~String() { if(--_count == 0) { cout<<"~String()"<<endl; delete[] _str; } } private: char*_str; int _count; }; void Test() { String s1("hello world!"); String s2=s1; String s3 = s2; } int main() { Test(); return 0; }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。