淺拷貝:拷貝構造時複製指標僅僅是對指標的值拷貝,而不開闢新的空間這樣就會造成在析構的時候。會對同一塊記憶體釋放兩次。
深拷貝:拷貝構造時會開闢新的記憶體,並把記憶體中的值進行拷貝
寫時拷貝:就是當你在讀取一片空間時,系統並不會為你開闢乙個一模一樣的空間給你;只有在當你真正修改的時候,才會開闢一片空間給你。
怎麼實現寫時拷貝呢?
(1)、使用引用計數來實現。所以我們在分配空間時需要多分配4個位元組,來記錄有多少個指標指向這個空間。
(2)、有新的指標指向這篇空間時,那麼引用計數就加一;當有乙個指標要釋放該空間時,那麼引用計數就減一。
(3)、當有指標要修改這片空間時,則為該指標重新分配自己的空間,原空間的引用計數減一,新空間的引用計數加一。
三、自己實現乙個string類
#include#includeusing namespace std;
class cstring
cstring(const cstring& rhs):mptr(rhs.mptr)
cstring& operator=(const cstring &rhs)
return *this;
} char& operator(int index)
return mptr[index];
} ~cstring()
void print()
private:
char* mptr;
int& getrefcount(char* ptr)
void release(char* ptr) }
};int main()
深拷貝 淺拷貝 寫時拷貝
在拷貝構造的時候,直接將原內容的位址交給要拷貝的類,兩個類共同指向一塊記憶體。缺陷 1 一旦對str2進行操作,str1的內容也會改變 2 析構時先析構str2,再析構str1,但是由於str1,str2指向同一塊記憶體空間,因此會導致對一塊記憶體進行兩次析構而出現錯誤 通過開闢和源空間大小相同的記...
淺拷貝,深拷貝,寫時拷貝
思想 我們用指標p申請了一塊記憶體空間,在用指標q指向了這一片記憶體空間,這時候這兩個指標指向的是同乙個記憶體空間,當需要釋放這塊記憶體空間的時候p會釋放一次,q也會釋放一次,這樣重複釋放就會引發程式的崩潰。我們通過一段 來理解淺拷貝 class person void test int main ...
C 淺拷貝 深拷貝 寫時拷貝
淺拷貝 編譯器只是直接將指標的值拷貝過來,結果多個物件共用了一塊記憶體,當乙個物件呼叫了析構函式將這塊記憶體釋放掉之後,另一些物件不知道這塊空間已經還給了系統,再次呼叫析構函式進行釋放時發現已經釋放了,就會造成程式崩潰。在類的成員中有指標型別的成員變數的時候,必須對其寫出顯式的拷貝建構函式和賦值運算...