c/c++野指針和空指針詳解

指針:

  • 在指針聲明時,* 號表示所聲明的變量爲指針
  • 在指針使用時,* 號表示操作指針所指向的內存空間

1)* 相當通過地址(指針變量的值)找到指針指向的內存,再操作內存

2)* 放在等號的左邊賦值(給內存賦值,寫內存)

3)* 放在等號的右邊取值(從內存中取值,讀內存)

野指針和空指針

空指針

標準定義了NULL指針,它作爲一個特殊的指針變量,表示不指向任何東西。要使一個指針爲NULL,可以給它賦值一個零值。爲了測試一個指針百年來那個是否爲NULL,你可以將它與零值進行比較。

對指針解引用操作可以獲得它所指向的值。但從定義上看,NULL指針並未執行任何東西,因爲對一個NULL指針因引用是一個非法的操作,在解引用之前,必須確保它不是一個NULL指針。

 如果對一個NULL指針間接訪問會發生什麼呢?結果因編譯器而異。

不允許向NULL和非法地址拷貝內存。

 

 

野指針

在使用指針時,要避免野指針的出現:

野指針指向一個已刪除的對象或未申請訪問受限內存區域的指針

與空指針不同,野指針無法通過簡單地判斷是否爲 NULL避免,而只能通過養成良好的編程習慣來盡力減少。對野指針進行操作很容易造成程序錯誤。

什麼情況下回導致野指針?

  • 指針變量未初始化

任何指針變量剛被創建時不會自動成爲NULL指針,它的缺省值是隨機的,它會亂指一氣。所以,指針變量在創建的同時應當被初始化,要麼將指針設置爲NULL,要麼讓它指向合法的內存。

 

  • 指針釋放後未置空

有時指針在free或delete後未賦值 NULL,便會使人以爲是合法的。別看free和delete的名字(尤其是delete),它們只是把指針所指的內存給釋放掉,但並沒有把指針本身幹掉。此時指針指向的就是“垃圾”內存。釋放後的指針應立即將指針置爲NULL,防止產生“野指針”。

 

  • 指針操作超越變量作用域

不要返回指向棧內存的指針或引用,因爲棧內存在函數結束時會被釋放。

 

操作野指針是非常危險的操作,應該規避野指針的出現:

  • 初始化時置 NULL

指針變量一定要初始化爲NULL,因爲任何指針變量剛被創建時不會自動成爲NULL指針,它的缺省值是隨機的。

 

  • 釋放時置 NULL

當指針p指向的內存空間釋放時,沒有設置指針p的值爲NULL。delete和free只是把內存空間釋放了,但是並沒有將指針p的值賦爲NULL。通常判斷一個指針是否合法,都是使用if語句測試該指針是否爲NULL。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章