[转]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的空间上。因此对这种状况,黑客也只能面对崩溃 翻白眼,感叹生不逢时啊。

相关文章
相关标签/搜索