想要知道野指針危害到底有多大,首先需要知道野指針是怎么形成的,以及形成野指針會(huì)帶來(lái)什么本質(zhì)上的缺點(diǎn)。
當(dāng)然,野指針嘛,畢竟還是個(gè)指針。如果不了解什么是指針的話,可以參考一下我的另外一篇回答:如何向計(jì)算機(jī)小白解釋C語(yǔ)言指針?。
這里我們舉個(gè)例子來(lái)說(shuō)明什么是野指針,還是上學(xué)期,學(xué)妹找我借書,李航寫的,統(tǒng)計(jì)學(xué)習(xí)方法。我就告訴她,書給我放到實(shí)驗(yàn)室我位置上的柜子上了。
就相當(dāng)于我指向一個(gè)數(shù)據(jù)給他,讓她去那里找,然后按照正常的套路,她就拿到書快樂(lè)的學(xué)習(xí)了。但是,如果這本書被別的同學(xué)拿走了,還有可能別的同學(xué)往里面,放了一些奇奇怪怪的別的書,這個(gè)時(shí)候?qū)W妹拿走的書是什么東西,就無(wú)解。
她以為她拿到了正常的數(shù)據(jù),我也以為我給了她正常的數(shù)據(jù),誰(shuí)曾想,她拿的并不是她想要的書,然后她就開始讀這本書了,讀到她碩士畢業(yè),發(fā)現(xiàn)錯(cuò)了,最后被延畢了,整個(gè)系統(tǒng)就崩了。
這件事情的危害就在于:錯(cuò)!不要緊!錯(cuò)了三年,系統(tǒng)崩了就出大問(wèn)題!
好好好,把剛才這個(gè)故事,轉(zhuǎn)化成專業(yè)術(shù)語(yǔ)來(lái)一遍:野指針,說(shuō)的就是一個(gè)指針,指向一塊數(shù)據(jù)。也就是這個(gè)指針變量里面存的是這個(gè)數(shù)據(jù)的地址,突然有一天,這個(gè)數(shù)據(jù)被別人釋放了,然后剩下一個(gè)空的內(nèi)存空間,還可以存別的數(shù)據(jù)。但是系統(tǒng)并不報(bào)錯(cuò),一直在運(yùn)行,程序員也不可能去驗(yàn)證每個(gè)數(shù)據(jù)跑地對(duì)不對(duì),所以就一直這么錯(cuò)下去了。打工人打了幾十年的白工!
野指針,就是指向一個(gè)已刪除的對(duì)象或者未申請(qǐng)?jiān)L問(wèn)受限內(nèi)存區(qū)域的指針。
危害是可能導(dǎo)致整個(gè)系統(tǒng)崩了,最大的問(wèn)題在于,很難被debug,也就是很難找到錯(cuò)誤!
導(dǎo)致這個(gè)問(wèn)題很容易出現(xiàn)的原因在于:free和delete只是把指針?biāo)傅?內(nèi)存給釋放掉,但并沒(méi)有把指針本身干掉。
想要比較好地去避免這個(gè)問(wèn)題,可以采用在釋放內(nèi)存之后,將指針賦值為NULL。所以很多人都會(huì)自己封裝一個(gè)free宏,在釋放內(nèi)存的同時(shí)將這個(gè)指針置NULL。