剛剛看代碼時看到這個問題,這篇博客就很好地解釋了這個問題,贊一個。安全
從簡單的代碼開始:編碼
int* p = new int;spa
*p = 5;指針
delete p;內存
p = NULL;博客
Line4把釋放了的指針當即設置爲null,咱們通常認識到是防止野指針的產生,從而致使程序崩潰。如:it
int* p = new int;程序
*p = 5;黑客
delete p;margin
*p = 12; //這裏崩潰
在Line4會崩潰。這種代碼在即便有良好編碼風格的代碼中也沒法避免,如:
int* p = new int;
if(p != NULL)
{
*p = 5;
}
delete p;
if(p != NULL)
{
*p = 20; //這裏一樣崩潰
}
可是指針設置NULL以後良好的代碼風格就能夠避免崩潰了。如:
int* p = new int;
if(p != NULL)
{
*p = 5;
}
delete p;
p = NULL;
if(p != NULL) //條件不知足
{
*p = 20; //這裏不會執行到了
}
可是代碼風格很差(使用指針前不檢測指針是否爲空)的狀況下,一樣崩潰:
int* p = new int;
*p = 5;
delete p;
p = NULL;
*p = 20;
這種崩潰和本文的第一例子代碼中的崩潰有什麼不一樣呢?
從程序使用性來看,都是程序不能用了。
可是安全性來看,可大不同了。、
(1)在沒有 "p = NULL;"時,指針p是指向一個內存地址的,只是這個內存地址對當前程序是非法的。對黑客來講,這但是一個機會。 每次程序崩潰時幾乎都會在同一個地址(p所指的位置),這個地址會很容易到黑客手上的,而後黑客能夠在指定的內存地址上事先佈置好本身的代碼,而後運行程序,崩潰時就會到黑客指定的代碼上去,結果不堪設想啦。
(2)在有"p = NULL;"時,程序一樣崩潰,但崩潰的地址是0. 0地址對任何程序都是非法的,因此再牛的黑客也不能把本身的代碼佈置到內存地址是0的空間上。因此對這種狀況,黑客也只能面對崩潰 翻白眼,感嘆生不逢時啊。