野指標和懸空指標

2021-09-26 14:42:10 字數 1098 閱讀 1324

一、野指標

產生的原因

(1)指標定義時未被初始化:指標在被定義的時候,如果程式不對其進行初始化的話,它會指向隨機區域,因為任何指標變數(除了static修飾的指標變數)在被定義的時候是不會被置空的,它的預設值是隨機的。

(2)指標被釋放時沒有被置空:我們在用malloc開闢記憶體空間時,要檢查返回值是否為空,如果為空,則開闢失敗;如果不為空,則指標指向的是開闢的記憶體空間的首位址。指標指向的記憶體空間在用free()或者delete(delete只是乙個操作符,free()是乙個函式)釋放後,如果程式設計師沒有對其置空或者其他的賦值操作,就會使其成為乙個野指標。

(3)指標操作超越變數作用域:不要返回指向棧記憶體的指標或引用,因為棧內存在函式結束的時候會被釋放;

a *p; // a為乙個自定義物件  

p->func(); // p是「野指

危害

野指標的問題在於,指標指向的記憶體已經無效,而指標沒有被置空,解引用乙個非空的無效指標是乙個未被定義的行為,也就是說不一定導致段錯誤,野指標很難定位到是**出現的問題

規避方法

1.初始化指標時將其置為null,之後再對其進行操作。

2.分配完記憶體(new)以後注意assert(p!=nullptr)

3.釋放指標時將其置為null,最好在編寫**時將free()函式封裝一下,在呼叫free()後就將指標置為null。

4.要想徹底地避免野指標,最好的辦法就是養成乙個良好的程式設計習慣。

需要注意的是:智慧型指標解決的是防止new後忘記delete的問題(記憶體洩露)

如何除錯

1.通過對new和delete運算子的過載來實現的(以記憶體為代價的,不可取)

2.通過對new替換成debug_new來實現功能更強更方便的指標檢測

二、懸空指標

指標正常初始化,曾指向過乙個正常的物件,但是物件銷毀了,該指標未置空,就成了懸空指標。

三、比較

int main()    

*pi = 6; // 由於 pi 指向的變數 i 已經銷毀,此時 pi 即成了懸空指標

return 0;

}

野指標 懸空指標和懸空引用

空懸指標是這樣一種指標 指標正常初始化,曾指向過乙個正常的物件,但是物件銷毀了,該指標未置空,就成了懸空指標。野指標是這樣一種指標 未初始化的指標,其指標內容為乙個垃圾數。一般我們定義乙個指標時會初始化為null或者直接指向所要指向的變數位址,但是如果我們沒有指向null或者變數位址就對指標進行使用...

C語言中「野指標」 「懸空指標」是什麼?

1 野指標 wild pointer 2 懸空指標 dangling pointer 野指標 wild pointer 是沒有被初始化過的指標,所以不確定指標具體指向。例如以下示例 void p 此時 p 是 野指標 因為 野指標 可能指向任意記憶體段,因此它可能會損壞正常的資料,也有可能引發其他未...

空指標和野指標

關於多次free 出現的野指標的原因 指標變數和指標變數所指的記憶體空間變數是兩個不同的概念 free 最主要釋放的指標變數所指的記憶體空間,因為記憶體資源是有限的,很寶貴,需要 利用 但是指標變數本身的值還是之前的指向,未重置成null 所以再次釋放的時候,指向了未知的記憶體區域,產生野指標 避免...