free 和 delete 把指针怎么了


转自http://www.cnblogs.com/kaituorensheng/archive/2013/08/09/3247687.html

     使用free或delete之后,只是把指针所指的内容给释放掉,但是指针并没有被干掉,还是指向原来位置(并不是执行NULL),此时指针指向的内容为垃圾,被称为“野指针”。

     举例说明几个重要容易迷糊的特征:

1. 指针消亡了,并不表示他所指向的内存会被自动释放。例:

void func(coid)
{
   char *p = (char *)malloc(sizeof(char) * 100);
}

      当函数执行完时,指针变量因为存在于栈上,会自动消亡。但是这不意味着分配的空间也会自动释放,原因是:动态非配的空间位于堆(动态内存分配区),必须自己去释放;否则,调用一次函数,造成一次内存泄露。

2. 内存被释放了,并不表示指针会自动消亡或变成NULL指针。例如

char *p = (char *)malloc(sizeof(char) * 100);
cout << &p << endl;
free p;
cout << &p << endl;
      可以看出两次输出是一样的,也就是说虽然内容被释放掉了。但是指针还是指向原地。delete告诉系统,此地址可以再次分配,并没有销毁。如果在你调用之前,内存就已经分配作其他用途的话,你通过指针访问那块区域的结果就是未知的。因此释放掉指针后,应该立马赋值为NULL。

3. 杜绝“野指针”

  • 指针变量要初始化。要么为NULL,要么为合法的内存
  • 指针被释放掉时,将指针置位NULL
  • 防止指针超越了变量的作用范围。例:
    for(int i=0; i<2; ++i)
    {
        p = &i;
    }
    cout << *p << endl;
    cout << i << endl;
      由于for循环之外,变量i已经销毁,因此再通过*p访问时危险的。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值