免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:032015年亚洲杯之中国
日期:2015-04-22 15:52:45
61 [报告]
发表于 2009-11-27 14:27 |只看该作者
指针赋来赋去的情况太多见了, 遍历稍复杂一点的数据结构, 基本上是都会出现的.
指望库函数帮你置空是不现实的~~~~有指针的地方就有野指针, 避免不了.

论坛徽章:
0
62 [报告]
发表于 2009-11-27 14:50 |只看该作者
某门编程语言,体现的是语言设计者的“个人哲学”,不同的语言,体现了不同设计者的“个人哲学”
而C语言设计者的“哲学”,最前面有人已经告诉你了,当然也让我想起我的签名,呵呵哈哈

论坛徽章:
0
63 [报告]
发表于 2009-11-27 15:46 |只看该作者

回复 #1 slow_hand 的帖子

明显懒汉的想法,
java好像有这种机制,
比如文件对象调用close,该对象会成为null
C, C++肯定不会,
这个是由于参数的传递机制决定的,
比如你的Free(void *ptr)
函数内部是没有办法修改ptr的指向的,只能修改其中的值,

对于你这种变态的需求,
建议你定义一个宏,
#define FREE(ptr) do { free(ptr); ptr = NULL;} while(0)
这样应该可以了。

论坛徽章:
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
64 [报告]
发表于 2009-11-27 15:54 |只看该作者
想全自动的话可以用VB

不过,当年的VB为了初学者方便到处修扶手,后果是混乱到连微软自己都受不了,以至于从VS.NET开始彻底重做,又把扶手全拆了。

我当年维护过十几万行的TCL工程,后果是被这种语言的诸多“便利”恶心到了,以至于自己设计一套库,要把 变量先声明然后才能使用 之类“不方便”的东西找回来。

这种“方便”玩意儿,给初学者写几百上千行的程序确实方便;但拿来写上万行的工程就是恐怖。




一种工具,如果设计给专业人员用,那么就要保证加上的任何东西都要可靠、有效、稳定,并且要便于拆卸和维护。
相反,如果设计给外行用,那么就要尽一切可能给他加上防护栏,防止他碰触到危险的地方,甚至干脆把内部结构封死,做成免维护的,然后再配一张详细的说明书。

很显然,如果你想当专业木匠,那么显然你应该去买“危险”的斧子、锯子,靠自己的手艺做出家具;
否则,你应该买成品家具或者“傻瓜式”“免工具”的散件,按照说明用搭扣把这些东西连接起来。


一般来说,给行家用的工具,应该是很少几个基本元素,然后可以根据这几个元素任意发挥、推导,最终建立起任意复杂的体系——只要你没理解错,那么你的发挥就不会出问题。
这个基本元素的设计,要么有严格理论作为依据;要么有大量实践经验作为后盾,向上添加任何东西都需要慎之又慎——宁可有危险,不可妨碍功能。
相反,给外行用的工具,会是一堆华丽的大杂烩。一切意外都先替你考虑到——宁可减功能,不可有危险。


当然,程序设计这一行过于复杂,为不同目的设计的语言成千上万——那么,当你抱怨一门流行语言时,最好先看看是不是自己选错了工具。

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
65 [报告]
发表于 2009-11-27 16:09 |只看该作者

回复 #63 souldemo 的帖子

不考虑lz的偷懒想法是否大家都可以接受.
如果定要一个可实现此功能的函数,应该也可以通过形参为二级指针来实现吧

论坛徽章:
0
66 [报告]
发表于 2009-11-27 16:13 |只看该作者
原帖由 slow_hand 于 2009-11-26 10:20 发表
为什么语言本身不在free或者delete的时候直接将指针置成NULL?这样不就完全杜绝了“野指针”的问题吗?

我觉得还得从什么是“野指针”讲起。那些危险的操作都是因为指针被释放掉了,而又被调用(野指针)。

对于某些细心的程序员,可能从来就不存在“野指针”,因为他们不会在释放掉后继续使用它们。

所以,设不设成NULL和解决“野指针”的问题不是紧耦合关系

论坛徽章:
0
67 [报告]
发表于 2009-11-27 16:28 |只看该作者
我觉得楼主需要首先明白的是什么情况下需要使用free

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
68 [报告]
发表于 2009-11-27 16:31 |只看该作者
原帖由 souldemo 于 2009-11-27 15:46 发表
对于你这种变态的需求,
建议你定义一个宏,
#define FREE(ptr) do { free(ptr); ptr = NULL;} while(0)
这样应该可以了。


此外如果delete后自动赋NULL的话,delete this就是语法错误了。

论坛徽章:
0
69 [报告]
发表于 2009-11-27 17:48 |只看该作者
如果需要free之后, 将指针置为NULL, 那么传给free的参数应该是指向指针的指针, 并且free做改动. 设计这样的API, 显然并不合适, 也很少见. C函数的参数传递是传值型(pass-by-value), 所以无法修改参数的值. 当你执行free(p)之后, p的值是无法在函数中被改变的.

[ 本帖最后由 ideawu 于 2009-11-27 17:49 编辑 ]

论坛徽章:
0
70 [报告]
发表于 2009-11-27 18:10 |只看该作者
假如支持这样做的话。那么 free, delete 的参数只能是左值。也就是说 delete (char*)0x1235;  或者 free((void*)0x123); 是不合法的, 或者只能是两套不同的方式了。
typedef int * int_ptr;  int_ptr *p = new int_ptr[10]; delete[] &(p[0]);
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP