見如下程式例項:
[cpp]view plain
copy
print?
#include
#include
intmain()
printf("p1:%d, &p1:%d\n"
,p1,&p1);
if(p1 != null)
//目的:釋放p1
printf("p1:%d, &p1:%d\n"
,p1,&p1);
system("pause"
);
return
0;
} 程式執行結果為:
[cpp]view plain
copy
print?
p1:0, &p1:2031188
p1:2233584, &p1:2031188
p1:2233584, &p1:2031188
請按任意鍵繼續. . .
由結果看出,p1並不為0,也就是在釋放p1時,僅僅釋放的是p1指向的記憶體空間,並沒有將指標p1指為空,此時p1就成了野指標!
避免策略--養成乙個習慣:
1、在定義乙個指標時初始化為null
2、釋放指標指向的記憶體空間時,將指標重置為null
即修改後上述例項**為:
[cpp]view plain
copy
print?
#include
#include
intmain()
printf("p1:%d, &p1:%d\n"
,p1,&p1);
if(p1 != null)
//目的:釋放p1
printf("p1:%d, &p1:%d\n"
,p1,&p1);
system("pause"
);
return
0;
}
野指標相關問題
最近在學習並行程式設計時注意到了uaf use after free 問題,引發uaf問題的原因一般是因為在釋放了某個指標指向的記憶體後,並沒有將該指標置空,從而可以通過該指標非法地修改記憶體。以前因為一直都沒有寫過大型專案,也不曾特別關心安全問題,雖然知道在指標申請後手動置為null但一度以為在f...
野指標和懸空指標
一 野指標 產生的原因 1 指標定義時未被初始化 指標在被定義的時候,如果程式不對其進行初始化的話,它會指向隨機區域,因為任何指標變數 除了static修飾的指標變數 在被定義的時候是不會被置空的,它的預設值是隨機的。2 指標被釋放時沒有被置空 我們在用malloc開闢記憶體空間時,要檢查返回值是否...
空指標和野指標
關於多次free 出現的野指標的原因 指標變數和指標變數所指的記憶體空間變數是兩個不同的概念 free 最主要釋放的指標變數所指的記憶體空間,因為記憶體資源是有限的,很寶貴,需要 利用 但是指標變數本身的值還是之前的指向,未重置成null 所以再次釋放的時候,指向了未知的記憶體區域,產生野指標 避免...