C 中的深拷貝與淺拷貝

2022-06-21 22:30:18 字數 764 閱讀 8203

在某些狀況下,類內成員變數需要動態開闢堆記憶體,如果實行位拷貝,也就是把物件裡的值完全複製給另乙個物件,如a=b。這時,如果b中有乙個成員變數指標已經申請了記憶體,那a中的那個成員變數也指向同一塊記憶體。這就出現了問題:當b把記憶體釋放了(如:析構),這時a內的指標就是野指標了,出現執行錯誤。

深拷貝和淺拷貝可以簡單理解為:如果乙個類擁有資源,當這個類的物件發生複製過程的時候,資源重新分配,這個過程就是深拷貝,反之,沒有重新分配資源,就是淺拷貝。下面舉個深拷貝的例子。

#include using namespace std;

class ca

ca(const ca& c)

void show()

~ca()

private:

int a;

char* str;

};int main()

/*當用乙個已經初始化過了的自定義類型別物件去初始化另乙個新構造的物件的時候,

拷貝建構函式就會被自動呼叫,如果你沒有自定義拷貝建構函式的時候,

系統將會提供給乙個預設的拷貝建構函式來完成這個過程,

上面**的複製核心語句就是通過ca(const ca& c)拷貝建構函式內的語句完成的。*/

深拷貝和淺拷貝的定義可以簡單理解成:如果乙個類擁有資源(堆,或者是其它系統資源),當這個類的物件發生複製過程的時候,這個過程就可以叫做深拷貝,反之物件存在資源,但複製過程並未複製資源的情況視為淺拷貝。

淺拷貝資源後在釋放資源的時候會產生資源歸屬不清的情況導致程式執行出錯。

c 中深拷貝與淺拷貝

如果沒有自定義複製建構函式,則系統會建立預設的複製建構函式,但系統建立的預設複製建構函式只會執行 淺拷貝 即將被拷貝物件的資料成員的值一一賦值給新建立的物件,若該類的資料成員中有指標成員,則會使得新的物件的指標所指向的位址與被拷貝物件的指標所指向的位址相同,delete該指標時則會導致兩次重複del...

C 中的淺拷貝與深拷貝

用自定義的string類解釋什麼是淺拷貝什麼是深拷貝。class string 淺拷貝是在呼叫拷貝函式時進行了值拷貝,這樣的拷貝看似沒有問題,在呼叫析構函式時會導致記憶體洩漏,系統奔潰。define crt secure no warnings 1 includeusing namespace st...

C 中的深拷貝與淺拷貝

1 拷貝建構函式 定義 如果乙個類的建構函式的第乙個引數是類自身類型別的引用,且任何額外引數都有預設值,則此建構函式為拷貝建構函式。由此可見,拷貝建構函式是一種特殊的建構函式,乙個類可以有多個拷貝建構函式,既可以是public的,也可以是private的 特殊用法,如設計模式中的單例模式需要將拷貝建...