相信很多人都自己去實現過string類的構造,拷貝構造,析構函式以及對字串的各種操作運算子的過載。但是在自己實現這些函式的時候,有的人可能會踩到這個深淺拷貝的雷,所以我在這篇部落格寫出我自己對這塊的理解
不要去執行,因為程式會奔潰,用除錯來監視s1和s2變數class
string
/*string(const string& s)
*/~string()
}private
:char
* _str;};
void
test()
intmain()
1.如果我們自己不寫拷貝構造,則編譯器會使用預設的拷貝建構函式,除錯之後我們會發現,s1和s2雖然內容一樣,但是!!!它兩的位址是一樣的然後執行有我們自己寫的拷貝建構函式的**,結果和是上邊是一樣的如果是一開始接觸這個知識點,可能我們會覺得這樣寫會完成拷貝構造。但是會出現問題,讓我們來解釋這個問題的時候我們可能說的不是那麼清楚明了,下邊我畫乙個簡單的圖來幫助理解(我們對乙個知識點的學習,不能模模糊糊,要知道為什麼,還要能說清楚為什麼)
上述就是我們所說的淺拷貝。知道了為什麼,那麼解決問題難度就不是很大了。問題顯而易見鎖定在了拷貝構造這塊,所以解決這個問題的方法就是,給s2開出乙個空間,然後將s1的資料拷貝到s2就行了。貼上修改之後的拷貝建構函式,以及**
這個**就實現的是深拷貝,深拷貝不同於淺拷貝的是,拷貝的時候回開闢出一塊空間,將被拷貝的資料,拷貝到開闢的空間。兩個指標指向的是不同的空間,空間裡面的資料是相同的。所以在呼叫析構函式,釋放空間的時候,就不會出現同時釋放同一塊空間兩次的情況,程式就不會奔潰。
深淺拷貝詳解
字典淺拷貝例項例項1 2345 67 a b a.copy a,b a 14 a,b 深度拷貝需要引入 copy 模組 例項1 2345 67 importcopy c copy.deepcopy a a,c a 15 a,c 1 b a 賦值引用,a 和 b 都指向同乙個物件。2 b a.copy...
深淺拷貝 詳解
concat 注意 關於array的slice和concat方法的補充說明 array的slice和concat方法不修改原陣列,只會返回乙個淺複製了原陣列中的元素的乙個新陣列。原陣列的元素會按照下述規則拷貝 如果該元素是個物件引用 不是實際的物件 slice 會拷貝這個物件引用到新的陣列裡。兩個物...
C 深淺拷貝
當結構體中沒有指標時,可進行淺拷貝,資料也會從乙個結構體拷貝到另乙個結構體 兩個結構體都存乙份資料 但當結構體中有指標的時候,假如使用使用淺拷貝,會使兩個結構體使用的指標都指向同乙個記憶體位址,在析構的時候會造成記憶體洩漏。深拷貝 需要對含有指標的結構體,使用 new 申請新的記憶體空間去儲存拷貝的...