免费注册 查看新帖 |

Chinaunix

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

脱裤子放屁的代码…… [复制链接]

论坛徽章:
0
111 [报告]
发表于 2007-08-10 14:40 |只看该作者
free(p); p=NULL;
分两点来看,如果需要通过置空来标志这个资源没有初始化或者需要重新初始化,那置空就是必须的了,当然也可以采用其他标志。

如果只是看起来好看,或者认为这样能减少错误发生,置空是无法起到这个作用的。

论坛徽章:
0
112 [报告]
发表于 2007-08-10 14:42 |只看该作者
对MJ感兴趣

论坛徽章:
0
113 [报告]
发表于 2007-08-10 16:29 |只看该作者
自己认为不对的往往是对的。

论坛徽章:
0
114 [报告]
发表于 2007-08-10 16:32 |只看该作者
多一句ptr=NULL; 会让coredump更容易出现. 因为对已经free或delete掉的指针进行引用是未必出错的.

而且设为NULL也可以看成一个标签, "下次想用这个指针的时候请重新赋值.".

论坛徽章:
0
115 [报告]
发表于 2007-08-10 16:40 |只看该作者
我就不明白了,你们怎么都那么喜欢讨论代码呢?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
116 [报告]
发表于 2007-08-10 16:49 |只看该作者
原帖由 holyfire 于 2007-8-10 16:40 发表
我就不明白了,你们怎么都那么喜欢讨论代码呢?

那么你喜欢讨论什么?
讨论丰胸的话可以去清茶。

论坛徽章:
0
117 [报告]
发表于 2007-08-10 17:02 |只看该作者
原帖由 zszyj 于 2007-8-10 12:28 发表

我确实可能没有你学C++懂,只是拿它写了5年以上几十万行的代码了. 你说的两个依据:一说delete 空指针不会core dump, 二说new对象内存不够时会默认抛出异常. 请你自已拿程序到各种UNIX平台试试再说吧, 包括AIX, ...


我就真的搞不懂了。。。
看1988年《The C Programming Languae》B.5 Utility Functions: <stdlib.h>
void free(void *p)
free deallocates the space pointed to by p; it does nothing if p is NULL. p must be a pointer to space previously allocated by calloc, malloc, or realloc.

看1997 BS 《The C++ Programming Language》charpter 6 6.2.6 free store
The delete operator may be applied only to a pointer returned by new or to zero. Applying
delete to zero has no effect.

你所举的平台真的不支持标准???!!!如果你所举的平台标准都不支持的话。。只能说IBM或者其他公司 的那些人都时吃干饭的。。

真的怀疑你写过多少代码!!

论坛徽章:
0
118 [报告]
发表于 2007-08-10 17:04 |只看该作者
free空指针确实是没问题的,这个毋庸置疑.

论坛徽章:
0
119 [报告]
发表于 2007-08-10 19:13 |只看该作者
http://discuss.joelonsoftware.com/default.asp?design.4.194233.15
上面也是一样的讨论。
不知道这边讨论晚了,还有多少人脱裤子放屁,又有多少喜欢穿裤子放屁?

论坛徽章:
0
120 [报告]
发表于 2007-08-10 19:24 |只看该作者
我觉得焦点不在于free的参数为NULL时,程序是否正常。手册已经明确的说明了free参数为NULL时候,程序的确定的动作。应该不会有偏差。这里的free,我觉得是否代表了诸如fclose等一样的角色。因为同样的会有很多人写诸如下面的代码
if (fp) {
  fclose (fp);
  fp = NULL;
}
。当然放到这个例子里,就不会像free一样,为NULL作为参数,函数是什么表现争论了。因为大部分情况,fclose(NULL)会导致coredump。
提到这个,就让我觉得疑惑。作为成对使用的函数组malloc/free,fopen/fclose,他们设计上还是很不同的。free之所以可以规定参数为NULL使用,实际上什么都不做,是因为malloc失败,定义成NULL。当然,malloc失败定义成NULL,是因为.... 这个和主题无关,暂且不谈。很明显的逻辑是,既然malloc失败,当然不能free!!
和malloc对应的fopen,情形如此的相似。但是fclose关于NULL传入时候的表现,却和free大相径庭。我们可以指责fclose这个设计是不合理的。NULL就是没有打开的代名词,你为什么要关闭它?
这里,free对于NULL的处理无疑是恰当的。作为设计者,完全可以和strcpy函数的设计一样,要求程序员自己保证buffer足够大不至于溢出。完全可以像fclose的设计者一样,把这个责任推给应用程序的设计者!但是,free 恰恰选择了一个防御性的策略,给了误用(不管是无知或者无意导致的错误,谁能写出没有一点点错误的程序?也许有。但是CUer应该没有)free的人一个体验有惊无险的机会。那我们还有什么理由来指责防御性的编程策略呢?

[ 本帖最后由 ivhb 于 2007-8-10 19:30 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP