野指針:
野指針不同於空指針,空指針是指一個指針的值為null,而野指針的值並不為null,野指針會指向一段實際的內存,只是它指向哪里我們並不知情,或者是它所指向的內存空間已經被釋放,所以在實際使用的過程中,我們並不能通過指針判空去識別一個指針是否為野指針。避免野指針只能靠我們自己養成良好的編程習慣,下面說說哪些情況下會產生野指針,以及怎樣避免。
1. 指針變量的值未被初始化: 聲明一個指針的時候,沒有顯示的對其進行初始化,那么該指針所指向的地址空間是亂指一氣的。如果指針聲明在全局數據區,那么未初始化的指針缺省為空,如果指針聲明在棧區,那么該指針會隨意指向一個地址空間。所以良好的編程習慣就是在聲明指針的時候就對其進行初始化,如果暫時不知道該初始化成什么值,就先把指針置空。
void func() { int *ptr; // 野指針 if (ptr != nullptr) { ……do_somthing } }
2.指針所指向的地址空間已經被free或delete:在堆上malloc或者new出來的地址空間,如果已經free或delete,那么此時堆上的內存已經被釋放,但是指向該內存的指針如果沒有人為的修改過,那么指針還會繼續指向這段堆上已經被釋放的內存,這時還通過該指針去訪問堆上的內存,就會造成不可預知的結果,給程序帶來隱患,所以良好的編程習慣是:內存被free或delete后,指向該內存的指針馬上置空。
void func() { int *ptr = new int[5]; delete []ptr; // 執行完delete后,ptr野指針 }
3.指針操作超越了作用域:
void func() { int *ptr = nullptr; { int a = 10; ptr = &a; } // a的作用域到此結束 int b = *ptr; // ptr指向a,a已經被回收,ptr野指針 }