指針是個(gè)很強(qiáng)大的工具即舌,可是正因?yàn)樗珡?qiáng)大,所以要操作它不是件易事肺樟。操作不當(dāng)造成的野指針檐春,甚至?xí)鹣到y(tǒng)死機(jī)等比較嚴(yán)重的后果。
如果程序定義了一個(gè)指針么伯,就必須要立即讓它指向一個(gè)我們?cè)O(shè)定的空間或者把它設(shè)為NULL疟暖,如果沒(méi)有這么做,那么這個(gè)指針里的內(nèi)容是不可預(yù)知的田柔,即不知道 它指向內(nèi)存中的哪個(gè)空間(即野指針)俐巴,它有可能指向的是一個(gè)空白的內(nèi)存區(qū)域,可能指向的是已經(jīng)受保護(hù)的區(qū)域硬爆,甚至可能指向系統(tǒng)的關(guān)鍵內(nèi)存欣舵,如果是那樣就糟 了,也許我們后面不小心對(duì)指針進(jìn)行操作就有可能讓系統(tǒng)出現(xiàn)紊亂缀磕,死機(jī)了缘圈。所以我們必須設(shè)定一個(gè)空間讓指針指向它劣光,或者把指針設(shè)為NULL,這是怎么樣的一 個(gè)原理呢糟把,如果是建立一個(gè)與指針相同類型的空間绢涡,實(shí)際上是在內(nèi)存中的空白區(qū)域中開(kāi)辟了這么一個(gè)受保護(hù)的內(nèi)存空間,然后用指針來(lái)指向它遣疯,那么指針里的地址就 是這個(gè)受保護(hù)空間的地址了雄可,而不是不可預(yù)知的啦,然后我們就可以通過(guò)指針對(duì)這個(gè)空間進(jìn)行相應(yīng)的操作了另锋;如果我們把指針設(shè)為NULL滞项,我們?cè)陬^文件定義中的 #define NULL 0 可以知道,其實(shí)NULL就是表示0夭坪,那么我們讓指針=NULL文判,實(shí)際上就是讓指針=0,如此室梅,指針里的地址(機(jī)器數(shù))就被初始化為0了戏仓,而內(nèi)存中地址為0 的內(nèi)存空間……不用多說(shuō)也能想象吧,這個(gè)地址是特定的亡鼠,那么也就不是不可預(yù)知的在內(nèi)存中亂指一氣的野指針了赏殃。
還應(yīng)該注意的 是,free和delete只是把指針?biāo)傅膬?nèi)存給釋放掉间涵,但并沒(méi)有把指針本身干掉仁热。指針p被free以后其地址仍然不變(非NULL),只是該地址對(duì)應(yīng) 的內(nèi)存是垃圾勾哩,p成了“野指針”抗蠢。如果此時(shí)不把p設(shè)置為NULL,會(huì)讓人誤以為p是個(gè)合法的指針思劳。用free或delete釋放了內(nèi)存之后迅矛,就應(yīng)立即將指 針設(shè)置為NULL,防止產(chǎn)生“野指針”潜叛。內(nèi)存被釋放了秽褒,并不表示指針會(huì)消亡或者成了NULL指針。(而且威兜,指針消亡了销斟,也并不表示它所指的內(nèi)存會(huì)被自動(dòng)釋 放。)
最后椒舵,總結(jié)一下野指針的的成因吧:
1蚂踊、指針變量沒(méi)有被初始化。任何指針變量剛被創(chuàng)建時(shí)不會(huì)自動(dòng)成為NULL指針逮栅,它的默認(rèn)值是隨機(jī)的悴势,它會(huì)亂指一氣。
2措伐、指針p被free或者delete之后特纤,沒(méi)有置為NULL,讓人誤以為p是個(gè)合法的指針侥加。
3捧存、指針操作超越了變量的作用范圍。這種情況讓人防不勝防担败。