空指針
問題思考:
案例探索:不允許向null和非法位址拷貝記憶體
野指針
什麼情況下會導緻野指針?
指針變量未初始化
指針釋放後未置空
指針操作超越變量作用域
如何規避野指針
初始化時置 null
釋放時 置 null
空指針
标準定義了null指針,它作為一個特殊的指針變量,表示不指向任何東西。要使一個指針為null,可以給它指派一個零值。為了測試一個指針百年來那個是否為null,你可以将它與零值進行比較。
對指針解引用操作可以獲得它所指向的值。但從定義上看,null指針并未指向任何東西,因為對一個null指針因引用是一個非法的操作,在解引用之前,必須確定它不是一個null指針。
如果對一個null指針間接通路會發生什麼呢?
結果因編譯器而異。
像vs就報錯,像dev這種牛逼的編譯器就沒事。
不允許向null和非法位址拷貝記憶體:
運作上面的案例就會報錯。
野指針
在使用指針時,要避免野指針的出現:
野指針指向一個已删除的對象或未申請通路受限記憶體區域的指針。與空指針不同,野指針無法通過簡單地判斷是否為 null避免,而隻能通過養成良好的程式設計習慣來盡力減少。對野指針進行操作很容易造成程式錯誤。
任何指針變量剛被建立時不會自動成為null指針,它的預設值是随機的,它會亂指一氣。是以,指針變量在建立的同時應當被初始化,要麼将指針設定為null,要麼讓它指向合法的記憶體。
比如下面代碼
雖然手動給出了位址,但是仍沒有指向合法的記憶體
有時指針在free或delete後未指派 null,便會使人以為是合法的。别看free和delete的名字(尤其是delete),它們隻是把指針所指的記憶體給釋放掉,但并沒有把指針本身幹掉。此時指針指向的就是“垃圾”記憶體。釋放後的指針應立即将指針置為null,防止産生“野指針”。
不要傳回指向棧記憶體的指針或引用,因為棧記憶體在函數結束時會被釋放。
操作野指針是非常危險的操作,應該規避野指針的出現:
指針變量一定要初始化為null,因為任何指針變量剛被建立時不會自動成為null指針,它的預設值是随機的。
比如上面的案例,就可以改成:
當指針p指向的記憶體空間釋放時,沒有設定指針p的值為null。delete和free隻是把記憶體空間釋放了,但是并沒有将指針p的值賦為null。通常判斷一個指針是否合法,都是使用if語句測試該指針是否為null。
例如上面使用完了之後,可以進行下面的操作 釋放p 置 null。