免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: reer
打印 上一主题 下一主题

free后,指针不为null? [复制链接]

论坛徽章:
1
双子座
日期:2015-01-04 14:25:06
31 [报告]
发表于 2010-11-15 18:51 |只看该作者
俺一般定义一个宏
blazewater 发表于 2009-10-12 15:57


那你还不如写成这样
  1. #define MY_FREE((point)) \

  2. do\

  3. {\

  4.     if(point!=NULL){free(point); \

  5.     point = NULL; }\

  6. }while(0);
复制代码
有意义吗?

论坛徽章:
1
双子座
日期:2015-01-04 14:25:06
32 [报告]
发表于 2010-11-15 18:52 |只看该作者
free()只是把指针指向的内存区域清空,至于指针又没有什么关系
smcree 发表于 2010-11-14 20:45




有这么傻的free

论坛徽章:
0
33 [报告]
发表于 2010-11-15 21:01 |只看该作者
包装一下free不就得了

void myfree(void** p){
free(*p);
*p=NULL;
}

论坛徽章:
0
34 [报告]
发表于 2010-11-16 09:57 |只看该作者
以前不知跟谁学的free后一定置NULL。

后来写了很长时间代码了。想了想。确实没有什么必要。

如果连指针目前什么状态都没搞清楚。逻辑流程都稀理糊涂。还何谈写出健状的代码呢?
想想为什么free为什么不设计成
void FREE(void **p)
{
    free(*p);
    *p = NULL;
}

FREE(&p)
的原应就明白了。因为free后跟本不用 p=NULL;

论坛徽章:
0
35 [报告]
发表于 2010-11-16 10:03 |只看该作者
本帖最后由 狗气球 于 2010-11-16 10:07 编辑
不谈需不需要置NULL,  我觉得如果一个指针跨越几百万行代码,那一定是有严重的设计问题。
donotblock 发表于 2010-11-15 13:07



    re。

    代码腐烂以后,你不置空那就是个访问野指针,置空那就是访问空指针。不论哪种,因为代码足够烂,都很难定位问题成因。解决不了咋办?使用之前加空指针判断。结果代码就更烂了。

    只不过访问空指针一般来说确实比访问野指针造成的问题容易定位一点。

论坛徽章:
0
36 [报告]
发表于 2010-11-16 12:55 |只看该作者
不谈需不需要置NULL,  我觉得如果一个指针跨越几百万行代码,那一定是有严重的设计问题。
donotblock 发表于 2010-11-15 13:07



    你理解错我的意思了,是整个产品的代码有那么多,出错了怎么排查?

论坛徽章:
0
37 [报告]
发表于 2010-11-16 13:42 |只看该作者
本帖最后由 zhangsuozhu 于 2010-11-17 14:09 编辑
  1. 置不置空也分情况的。
  2. 比如:
  3. statuc char *array[i] = {NULL};
  4. 然后可能存在重多的array[i]  = malloc(xxxx);

  5. 然后有的成功,有的没成功。然后做一个操作,就释放了。如:
  6. if (!array[i])
  7. {
  8.      .............
  9.      free(array[i]);
  10.      array[i] = NULL;
  11. }


  12. 最后可能有一个全部回收的函数如:
  13. void  distrory()
  14. {
  15.      int i;
  16.     for(i = 0; i < sizeof(array); i++)
  17.     {
  18.            if (!array[i])
  19.                  free(array[i]);
  20.     }
  21. }

  22. 其中每一步都在不同的函数里。所以最后的destory是要判断空的。
复制代码

论坛徽章:
0
38 [报告]
发表于 2010-11-17 13:56 |只看该作者
想想C语言的法则,你就会明白无论free怎么实现也无法把它变成NULL,旁门左道不算
cjaizss 发表于 2010-11-15 12:45



对了, 函数里的用的p 和实质的p 是2个东西。

所以free 是不能把p = NULL的。

论坛徽章:
0
39 [报告]
发表于 2010-11-17 13:58 |只看该作者
设计成free(&p)就可以

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
40 [报告]
发表于 2010-11-17 14:01 |只看该作者
以前不知跟谁学的free后一定置NULL。

后来写了很长时间代码了。想了想。确实没有什么必要。

如果连指针目前什么状态都没搞清楚。逻辑流程都稀理糊涂。还何谈写出健状的代码呢?
zhangsuozhu 发表于 2010-11-16 09:57

重复一下让更多的人看看。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP