免费注册 查看新帖 |

Chinaunix

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

为什么free或者delete的时候不直接将指针置成NULL? [复制链接]

论坛徽章:
0
41 [报告]
发表于 2009-11-26 16:38 |只看该作者
原帖由 zhoubug 于 2009-11-26 16:02 发表


你是想每次调用free这样 char *ptr ....free(&ptr);?
否则你想让语言设计怎么处理?改变它的函数调用时的传值规则?

您说的这个问题确实存在。但是如果一开始free被设计成自动给指针赋值NULL的话,可能比现在的更好一些。这只是我个人看法,呵呵。

论坛徽章:
0
42 [报告]
发表于 2009-11-26 17:23 |只看该作者
NULL 真正的含义是pointer to null object, 所以并非任何情况下都等于 0, 对于底层来说, 0 某些情况下确实是个有效的地址。所以free自动设置为0是有副作用的。
所以只有 pointer to null object 与 0 是等同的时候才应该这么做。

论坛徽章:
0
43 [报告]
发表于 2009-11-26 17:32 |只看该作者
原帖由 pagx 于 2009-11-26 17:23 发表
NULL 真正的含义是pointer to null object, 所以并非任何情况下都等于 0, 对于底层来说, 0 某些情况下确实是个有效的地址。所以free自动设置为0是有副作用的。
所以只有 pointer to null object 与 0 是等同 ...

但是用NULL就保证没错。

论坛徽章:
0
44 [报告]
发表于 2009-11-26 17:38 |只看该作者
原帖由 shan_ghost 于 2009-11-26 16:05 发表
1、设计语言和设计库接口,想要好学好用并且稳定,就要遵循“完整且最小”原则

完整就是功能完整;最小就是没有任何一个功能和其他功能重复或可以通过组合其他几个功能拼凑出来。


2、C语言功能已经完整 ...

那为啥有了strcpy还要strncpy?

论坛徽章:
0
45 [报告]
发表于 2009-11-26 17:43 |只看该作者
原帖由 slow_hand 于 2009-11-26 17:32 发表

但是用NULL就保证没错。


大神啊,求您了,用 C# 或者 Java 或者脚本语言吧……

论坛徽章:
1
15-16赛季CBA联赛之佛山
日期:2015-12-14 17:57:31
46 [报告]
发表于 2009-11-26 17:53 |只看该作者
设计的时候,专家认为free掉的指针大家肯定不会用,没想到,居然还有人用。

专家想,服了你们了,free了还用,这样吧,咱们来定个规矩:free掉之后必须置为空,这样就可以用了。

省的老有人说,为啥free掉的指针就不能用了,不是不能用,是先置为空再用。

论坛徽章:
0
47 [报告]
发表于 2009-11-26 18:01 |只看该作者

1.请大家不要把free的实现和c语言的设计拉扯到一起,多么哦戳的行为!
2.all is ok!

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
48 [报告]
发表于 2009-11-26 18:10 |只看该作者
原帖由 slow_hand 于 2009-11-26 17:38 发表

那为啥有了strcpy还要strncpy?


因为strcpy可能写越界,而strncpy不会。

另外,strncpy要同时检查\0和已拷贝字符数两个条件,而strcpy只需要检查\0即可——注意这个检查是每拷贝一个字符都要进行的——所以大量拷贝数据时strcpy更快一些。


另外,软件开发是一个新兴的科目。比如C语言库就喜欢多次利用库函数的返回值: 返回-1就是失败,返回其他值,则这个值可能就是个指向有效数据的指针。

这个设计思想在早期内存受限、速度较慢的系统上或许是必要的;但现在,新的设计标准建议严格区分返回值的作用——比如用且只用返回值表示执行是否成功,真正的返回数据则要通过引用型参数取得;甚至更激进的、要求发生任何错误都抛异常,以免程序员偷懒忽略返回值检查的思路都有。


所以,语言设计由于图灵的功劳,可以说是一个已经解决或有明确解决方案的问题;而库的设计则因现实情况而多变。

所以,接口设计“完整且最小”是一个基本标准,但这个标准并不阻止提供额外的、更方便的接口;只是警告设计者,在添加这类看似很美丽的接口之前一定要三思。

论坛徽章:
0
49 [报告]
发表于 2009-11-26 18:18 |只看该作者
原帖由 slow_hand 于 2009-11-26 17:32 发表

但是用NULL就保证没错。


的确是不错, 但是编译器并没法知道 NULL 真正的值,或许并不存在, 要知道指针只是一个内存地址值而已!  让机器去处理不确定的事情,那是强机器所难。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
50 [报告]
发表于 2009-11-26 18:26 |只看该作者
原帖由 pagx 于 2009-11-26 18:18 发表

但是编译器并没法知道 NULL 真正的值,或许并不存在

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP