c++:深淺拷貝總結(深拷貝的傳統和現代寫法)
阿新 • • 發佈:2018-12-10
深淺拷貝區別:
- 淺拷貝只拷貝指標,但拷貝後兩個指標指向同一個記憶體空間;
- 深拷貝不但對指標進行拷貝,而且對指標指向的內容進行拷貝,
- 呼叫拷貝建構函式後,淺拷貝還有聯絡,深拷貝的兩個物件完全獨立。
- 淺拷貝類似於檔案建立快捷方式,而深拷貝好比檔案複製。
- 編譯器預設提供的預設拷貝建構函式是淺拷貝,深拷貝的建構函式需自己實現。
注意:淺拷貝多個物件共用一個資源,當一個物件銷燬時,資源就會釋放。如果對另一個對在進行銷燬。會因為資源重複釋放造成程式崩潰!
深拷貝的傳統和現代寫法:
傳統寫法:開闢空間複製內容
class String { public: String(const char* str = "") :_str(new char[strlen(str) + 1]) { strcpy(_str,str); } String(const String& s) :_str(new char[strlen(s._str) + 1]) { strcpy(_str,s._str); } String& operator=(const String& s) { //如果用自己對自己賦值直接返回 if (this != &s) { delete[] _str; _str = new char[strlen(s._str) + 1]; strcpy(_str,s._str); //方法二: /*char* tmp = new char[strlen(s._str) + 1]; strcpy(tmp, s._str); delete[] _str; _str = tmp;*/ } return *this; } ~String() { delete[] _str; } private: char* _str; };
現代寫法:藉助指標交換
class String { public: String(const char* str = "") :_str(new char[strlen(str) + 1]) { strcpy(_str,str); } String(const String& s) :_str(NULL) { String tmp(s._str); swap(_str,tmp._str); } String& operator=(String s) { swap(_str,s._str); return *this; } ~String() { delete[] _str; } private: char* _str; };