免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
11 [报告]
发表于 2009-10-12 12:59 |只看该作者
原帖由 drangon 于 2009-10-12 12:55 发表

free之后设置 p=NULL,不是为了使代码更加正确,而是当代码出现错误时,能够马上显露出来,
而不是造成副作用后,再过一段时间才显露,那个时候显露出错,就很难找回代码真正出错的地方了。


可否解释一下你说的“当代码出现错误时,能够马上显露出来”?

我这里测试的结果:free(0) 并不能让错误显现。

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
12 [报告]
发表于 2009-10-12 13:01 |只看该作者
同意楼上!!

论坛徽章:
0
13 [报告]
发表于 2009-10-12 13:26 |只看该作者
原帖由 langue 于 2009-10-12 12:59 发表


可否解释一下你说的“当代码出现错误时,能够马上显露出来”?

我这里测试的结果:free(0) 并不能让错误显现。



free(0)是允许的,而且可以多次执行。

论坛徽章:
0
14 [报告]
发表于 2009-10-12 13:34 |只看该作者

回复 #13 hellowon 的帖子

是的,如果 free(p); p=NULL; 之后又 free(p) 一次,这样的逻辑错误就检查不出来。

论坛徽章:
0
15 [报告]
发表于 2009-10-12 13:50 |只看该作者
不赞成free之后,指针置空是多余的。

当然对于不太复杂的逻辑中,可以不用置空

论坛徽章:
0
16 [报告]
发表于 2009-10-12 15:57 |只看该作者
俺一般定义一个宏

  1. #define MY_FREE((point)) \
  2. do\
  3. {\
  4.     free(point); \
  5.     point = NULL; \
  6. }while(0);
复制代码

论坛徽章:
0
17 [报告]
发表于 2009-10-12 21:18 |只看该作者
free(p),如果程序中不再用p可以不置NULL;若还会用到p,最好置NULL。

论坛徽章:
0
18 [报告]
发表于 2009-10-12 22:05 |只看该作者
原帖由 langue 于 2009-10-12 12:59 发表


可否解释一下你说的“当代码出现错误时,能够马上显露出来”?

我这里测试的结果:free(0) 并不能让错误显现。


正常free之后,又重复free的情况,
如果没有置NULL,则有可能free一个未申请的地址,或者free另外一个后来重新malloc的地址,都有可能导致程序crash。
如果置NULL,这个虽然是逻辑错误,但实际不会造成不良影响,相当于暂时绕过问题。

我说的“马上显露出来”,主要是针对正常free之后,又再访问这个指针,
如果没有置NULL,访问时有可能程序crash,但更多的可能是这个内存还有效,但被别的地方申请了,这时如果修改内容,会导致其他地方被修改,
此时不会马上出错,但过一会儿,在别的地方访问那块内存时候,由于值错误,可能导致crash,这种问题就很难查了。
如果有置NULL,那么访问时马上crash,问题容易查些。

论坛徽章:
0
19 [报告]
发表于 2009-10-13 09:14 |只看该作者
我更接受drangon 的观点,在free之后做p=NULL;的操作,相当于把指针回复到初始状态。

相当于给后面的使用者提供一个纯净的变量,:)

论坛徽章:
0
20 [报告]
发表于 2010-11-14 17:07 |只看该作者
{:3_200:}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP