指針懸掛: 問題:使用new申請的內存內存空間無法訪問,,也無法釋放,。 原因:直接對指向new申請的存儲空間的指針變量進行賦值修改 后果:失去了原來的地址,原來的空間無法訪問也無法釋放,,造成內存泄漏 還可能造成同一個內存釋放兩次 容易引起指針懸掛的方式:對象的初始化和對象間賦值 容易引起指針懸掛的條件:類中含有指針類型的成員時,,使用默認的拷貝構造函數(shù)和賦值函數(shù)都會出現(xiàn)兩個指針變量互相賦值,產生指針懸掛的問題,。 解決方法:需要重新定義拷貝構造函數(shù)和超載賦值運算符 賦值操作符: 作用:兩個已經存在的對象間相互賦值,,產生兩個完全相同的內存拷貝 舉例:string a("hello");//調用構造函數(shù) string b("would");//調用構造函數(shù) string c=a;//調用拷貝構造函數(shù)--風格差,應使用string c(a) c=b; //調用拷貝賦值函數(shù) 重載賦值運算符: 語法:
注意: 1,、第一個引用的作用(為什么使用返回函數(shù)引用): 原因:為了實現(xiàn)對象間的連續(xù)賦值,。 使用返回函數(shù)引用的好處:結果得到的是一個變量,它既可以當左值,,也可當右值,,且采用賦值時沒有引入臨時變量,直接從原結果拷貝,。 2,、第二個引用的作用:防止調用拷貝構造函數(shù),,因為拷貝構造函數(shù)也可能引起指針懸掛 3,、const的作用:當參數(shù)使用引用時,可能會改變傳入的參數(shù),,為了避免這樣,,就使用const 具體代碼:
拷貝構造函數(shù)和重載賦值運算符的代碼對比:
注意: 1、參數(shù)都是一樣的,,都有const和引用,,但是帶他們的原因不同,具體見上面,。 2,、拷貝構造函數(shù)無返回值,而重載賦值運算符使用 返回函數(shù)引用,。 |
|
來自: just_person > 《文摘》