c/c++中delete/free 指针后,设置p=NULL的好处

从简单的代码开始:


    int* p = new int;
    *p = 5;
    delete p;
    p = NULL;

Line4把释放了的指针立即设置为null,我们一般认识到是防止野指针的产生,从而导致程序崩溃。如:


    int* p = new int;
    *p = 5;
    delete p;
    *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的空间上。所以对这种情况,黑客也只能面对崩溃 翻白眼,感叹生不逢时啊。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值