我們是不是經常會有這樣的疑問: 記憶體空間被回收是不是這塊記憶體空間被清空了?何為野指針 ,怎樣避免野指針?
//在堆記憶體申請一塊記憶體 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