天天看點

關于野指針及指針所指記憶體被回收後的一些誤區

我們是不是經常會有這樣的疑問: 記憶體空間被回收是不是這塊記憶體空間被清空了?何為野指針 ,怎樣避免野指針?

    //在堆記憶體申請一塊記憶體 32位 4位元組,64位 8位元組 的空間 ,定義一個指針變量 p 指向這塊空間

    int * p  = (int *)malloc(sizeof(int));

 //給變量p所指的變量位址指派

    *p = 10;

    // free(p)回收p所指的記憶體 注意 : 回收記憶體的空間,隻是說這塊空間可以再被利用了,并不是這塊空間的資料被清空了,這塊空間還儲存的是10的變量。執行free(p)這一句代碼後的p就是野指針;

    free(p);

    cout << "&p is  ----  before"<< &p<<endl;

    cout << "p is ----  before"<< p <<endl;

此時列印結果 :

&p is  ----  before 0x7ffeefbff508

p is ----  before 0x102802d00

 //此時的p指向的位址仍然是10所在的記憶體位址,但這塊址已被回收了此時的p就是一個野指針 。 由此可見 野指針 :指向一個已被回收/釋放的記憶體位址的指針 

   //為避免野指針,應該加上這一句

    p = NULL ;

    cout << "&p is ----  after "<< &p<<endl;

    cout << "p is ----  after "<< p <<endl;

此時列印結果 :

&p is ----  after 0x7ffeefbff508

p is ----  after 0x0

些時p被賦為NULL,為一個空指針。

因為 p是定義的一個指針變量,是存在棧中的,函數沒執行完 p的位址是不會被清空 &p的值才沒有改變。

轉載于:https://www.cnblogs.com/jdxiao/p/10058611.html