C/C++野指針


野指針:

        野指針不同於空指針,空指針是指一個指針的值為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野指針
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM