淺拷貝和深拷貝
深淺拷貝是在c++程式設計中,對於類物件來說,其內部存在各種型別成員變數,在拷貝過程中會出現問題。
淺拷貝在有指標的情況下,淺拷貝只是增加了乙個指標指向已經存在的記憶體,而深拷貝就是增加乙個指標並且申請乙個新的記憶體,使這個增加的指標指向這個新的記憶體
char* _ptr;
int _countref;
用_countref
對這塊空間進行監視,當一直有指標指向這塊空間時不對它進行釋放,當引用計數為0時再對其釋放,這樣就避免了剛剛出現的問題,具體**如下:
#include
using
namespace
std;
class string
else
*_countref = 1;
}string(const string & s)
:_ptr(s._ptr)
, _countref(s._countref)
~string()
void release()
}string& operator= (const string & s)
return *this;
}private:
char* _ptr;
int* _countref;
};
寫時拷貝由於釋放記憶體空間,開闢記憶體空間時花費時間,因此,在我們在不需要寫,只是讀的時候就可以不用新開闢記憶體空間,就用淺拷貝的方式建立物件,當我們需要寫的時候才去新開闢記憶體空間。這種方法就是寫時拷貝。在原有的引用計數的基礎上加上寫時拷貝:
char
operator(int index)
return _ptr[index];
}
深拷貝是開闢一塊新的空間,讓新空間中的內容和原空間內容完全相同,然後讓指標指向這塊空間,這樣在析構時不會造成對同一塊記憶體空間釋放多次的情況
#include
#include
class string
else
}string(const string &s)
:_pstr (_pstr = new
char[strlen(s._pstr) + 1])
string &operator=(const string &s)
return * this ;
}~string() //析構函式
}private:
char* _pstr;
};void funtest()
int main()
合理選用合適的拷貝有利於提高**的效率。 String類與深淺拷貝
1 概念 被複製物件的所有變數都含有與原來的物件相同的值,而所有的對其他物件的引用仍然指向原來的物件。換言之,淺拷貝僅僅複製所考慮的物件,而不是複製它所引用的物件。2 舉例 class string else string const string s string operator const s...
string類的深淺拷貝問題
字串是我們在編寫程式的時候經常用的到的。c 庫已經幫我們實現了乙個功能更加強大的字串類string,我們要去了解它是怎麼實現的。只要是涉及到 string類的地方多少都會涉及到深淺拷貝的問題。在c 中,在用乙個物件初始化另乙個物件時,只複製了成員,並沒有複製資源,使兩個物件同時指向了同一資源的複製方...
關於string類的深淺拷貝問題
首先,先看一下下面的 會出現什麼問題?class string else string string const string s data s.data private char data void test 上面的程式會奔潰,讓我們來分析原因 這就是所謂的淺拷貝,也稱位拷貝,編譯器只是直接將指標...