[轉]c/c++中delete/free 指針後,設置p=NULL的好處

剛剛看代碼時看到這個問題,這篇博客就很好地解釋了這個問題,贊一個。安全

從簡單的代碼開始:編碼

  1. int* p = new int;spa

  2. *p = 5;指針

  3. delete p;內存

  4. p = NULL;博客

Line4把釋放了的指針當即設置爲null,咱們通常認識到是防止野指針的產生,從而致使程序崩潰。如:it

  1. int* p = new int;程序

  2. *p = 5;黑客

  3. delete p;margin

  4. *p = 12; //這裏崩潰

在Line4會崩潰。這種代碼在即便有良好編碼風格的代碼中也沒法避免,如:

  1. int* p = new int;

  2. if(p != NULL)

  3. {

  4.     *p = 5;

  5. }

  6. delete p;

  7. if(p != NULL)

  8. {

  9.     *p = 20;   //這裏一樣崩潰

  10. }

可是指針設置NULL以後良好的代碼風格就能夠避免崩潰了。如:

  1. int* p = new int;

  2. if(p != NULL)

  3. {

  4.     *p = 5;

  5. }

  6. delete p;

  7. p = NULL;

  8. if(p != NULL) //條件不知足

  9. {

  10.     *p = 20;  //這裏不會執行到了

  11. }

可是代碼風格很差(使用指針前不檢測指針是否爲空)的狀況下,一樣崩潰:

  1. int* p = new int;

  2. *p = 5;

  3. delete p;

  4. p = NULL;

  5. *p = 20;

這種崩潰和本文的第一例子代碼中的崩潰有什麼不一樣呢?

從程序使用性來看,都是程序不能用了。

可是安全性來看,可大不同了。、

(1)在沒有 "p = NULL;"時,指針p是指向一個內存地址的,只是這個內存地址對當前程序是非法的。對黑客來講,這但是一個機會。 每次程序崩潰時幾乎都會在同一個地址(p所指的位置),這個地址會很容易到黑客手上的,而後黑客能夠在指定的內存地址上事先佈置好本身的代碼,而後運行程序,崩潰時就會到黑客指定的代碼上去,結果不堪設想啦。

(2)在有"p = NULL;"時,程序一樣崩潰,但崩潰的地址是0. 0地址對任何程序都是非法的,因此再牛的黑客也不能把本身的代碼佈置到內存地址是0的空間上。因此對這種狀況,黑客也只能面對崩潰 翻白眼,感嘆生不逢時啊。

相關文章
相關標籤/搜索