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