野指针理解和处理
指針是個很強大的工具,可是正因為它太強大,所以要操作它不是件易事。操作不當造成的野指針,甚至會引起系統死機等比較嚴重的后果。
如果程序定義了一個指針,就必須要立即讓它指向一個我們設定的空間或者把它設為NULL,如果沒有這么做,那么這個指針里的內容是不可預知的,即不知道 它指向內存中的哪個空間(即野指針),它有可能指向的是一個空白的內存區域,可能指向的是已經受保護的區域,甚至可能指向系統的關鍵內存,如果是那樣就糟 了,也許我們后面不小心對指針進行操作就有可能讓系統出現紊亂,死機了。所以我們必須設定一個空間讓指針指向它,或者把指針設為NULL,這是怎么樣的一 個原理呢,如果是建立一個與指針相同類型的空間,實際上是在內存中的空白區域中開辟了這么一個受保護的內存空間,然后用指針來指向它,那么指針里的地址就 是這個受保護空間的地址了,而不是不可預知的啦,然后我們就可以通過指針對這個空間進行相應的操作了;如果我們把指針設為NULL,我們在頭文件定義中的 #define NULL 0 可以知道,其實NULL就是表示0,那么我們讓指針=NULL,實際上就是讓指針=0,如此,指針里的地址(機器數)就被初始化為0了,而內存中地址為0 的內存空間……不用多說也能想象吧,這個地址是特定的,那么也就不是不可預知的在內存中亂指一氣的野指針了。
還應該注意的 是,free和delete只是把指針所指的內存給釋放掉,但并沒有把指針本身干掉。指針p被free以后其地址仍然不變(非NULL),只是該地址對應 的內存是垃圾,p成了“野指針”。如果此時不把p設置為NULL,會讓人誤以為p是個合法的指針。用free或delete釋放了內存之后,就應立即將指 針設置為NULL,防止產生“野指針”。內存被釋放了,并不表示指針會消亡或者成了NULL指針。(而且,指針消亡了,也并不表示它所指的內存會被自動釋 放。)
最后,總結一下野指針的的成因吧:?
1、指針變量沒有被初始化。任何指針變量剛被創建時不會自動成為NULL指針,它的默認值是隨機的,它會亂指一氣。 ?
2、指針p被free或者delete之后,沒有置為NULL,讓人誤以為p是個合法的指針。
3、 指針操作超越了變量的作用范圍。這種情況讓人防不勝防。
如果程序定義了一個指針,就必須要立即讓它指向一個我們設定的空間或者把它設為NULL,如果沒有這么做,那么這個指針里的內容是不可預知的,即不知道 它指向內存中的哪個空間(即野指針),它有可能指向的是一個空白的內存區域,可能指向的是已經受保護的區域,甚至可能指向系統的關鍵內存,如果是那樣就糟 了,也許我們后面不小心對指針進行操作就有可能讓系統出現紊亂,死機了。所以我們必須設定一個空間讓指針指向它,或者把指針設為NULL,這是怎么樣的一 個原理呢,如果是建立一個與指針相同類型的空間,實際上是在內存中的空白區域中開辟了這么一個受保護的內存空間,然后用指針來指向它,那么指針里的地址就 是這個受保護空間的地址了,而不是不可預知的啦,然后我們就可以通過指針對這個空間進行相應的操作了;如果我們把指針設為NULL,我們在頭文件定義中的 #define NULL 0 可以知道,其實NULL就是表示0,那么我們讓指針=NULL,實際上就是讓指針=0,如此,指針里的地址(機器數)就被初始化為0了,而內存中地址為0 的內存空間……不用多說也能想象吧,這個地址是特定的,那么也就不是不可預知的在內存中亂指一氣的野指針了。
還應該注意的 是,free和delete只是把指針所指的內存給釋放掉,但并沒有把指針本身干掉。指針p被free以后其地址仍然不變(非NULL),只是該地址對應 的內存是垃圾,p成了“野指針”。如果此時不把p設置為NULL,會讓人誤以為p是個合法的指針。用free或delete釋放了內存之后,就應立即將指 針設置為NULL,防止產生“野指針”。內存被釋放了,并不表示指針會消亡或者成了NULL指針。(而且,指針消亡了,也并不表示它所指的內存會被自動釋 放。)
最后,總結一下野指針的的成因吧:?
1、指針變量沒有被初始化。任何指針變量剛被創建時不會自動成為NULL指針,它的默認值是隨機的,它會亂指一氣。 ?
2、指針p被free或者delete之后,沒有置為NULL,讓人誤以為p是個合法的指針。
3、 指針操作超越了變量的作用范圍。這種情況讓人防不勝防。
總結