原帖由 bruceteen 于 2009-11-26 10:46 发表
老实说,可能你听了之后不舒服。
“free或者delete的时候直接将指针置成NULL”是一种自以为是的暴傻行为,所以C/C++不这么做。
原帖由 zhoubug 于 2009-11-26 11:04 发表
spirit of c:
1,Trust the programmer.
2,Don't prevent the programmer from doing what needs to be done.
3,Keep the language small and simple.
4,Provide only one way to do an operation.
5,Make ...
原帖由 slow_hand 于 2009-11-26 11:12 发表
请问您在平时编程的时候,free或者delete之后是不是立即将指针置成NULL,或者类似的值?
如果是的话,完全可以把它修改到标准中去,对吧?
原帖由 slow_hand 于 2009-11-26 11:12 发表
请问您在平时编程的时候,free或者delete之后是不是立即将指针置成NULL,或者类似的值?
如果是的话,完全可以把它修改到标准中去,对吧?
原帖由 flw 于 2009-11-26 11:15 发表
我从不认为赋值为 NULL 和 free 是需要联动的。
该赋值为 NULL 的时候,我自然会赋值为 NULL,而不必在乎它是否刚刚 free 过。
原帖由 emacsnw 于 2009-11-26 13:07 发表
这个p可能在某个比较复杂对象里面,该对象是某个容器的一个成员,这个对象会自动析构自身的指针成员的那种,那个容器出了scope后就会让q成为野指针,这个和要不要delete后置0没有关系,无法避免的,必须要程 ...
原帖由 benjiam 于 2009-11-26 13:40 发表
我所有的代码在 free 以后都会设置成为NULL.
为下次扑捉 bug 提供条件。这是很个很普遍的做法。
而且我也能找到freen 以后设置为NULL 的很多优点, 简单的说 多线程的代码,当你发现一个不该出现 NULL指针的地 ...
原帖由 koolcoy 于 2009-11-26 15:01 发表
我认为free后自动置成NULL没太大的问题。
持反对意见的给个例子说明一下置成NULL有不好的副作用。不要拿哲学说事,我是程序员不是哲学家![]()
btw:不要认为C的全部都是好的
原帖由 zhoubug 于 2009-11-26 16:02 发表
你是想每次调用free这样 char *ptr ....free(&ptr);?
否则你想让语言设计怎么处理?改变它的函数调用时的传值规则?
原帖由 pagx 于 2009-11-26 17:23 发表
NULL 真正的含义是pointer to null object, 所以并非任何情况下都等于 0, 对于底层来说, 0 某些情况下确实是个有效的地址。所以free自动设置为0是有副作用的。
所以只有 pointer to null object 与 0 是等同 ...
原帖由 shan_ghost 于 2009-11-26 16:05 发表
1、设计语言和设计库接口,想要好学好用并且稳定,就要遵循“完整且最小”原则
完整就是功能完整;最小就是没有任何一个功能和其他功能重复或可以通过组合其他几个功能拼凑出来。
2、C语言功能已经完整 ...
原帖由 shan_ghost 于 2009-11-26 18:10 发表
因为strcpy可能写越界,而strncpy不会。
另外,strncpy要同时检查\0和已拷贝字符数两个条件,而strcpy只需要检查\0即可——注意这个检查是每拷贝一个字符都要进行的——所以大量拷贝数据时strcpy更快一些 ...
原帖由 ttcn_cu 于 2009-11-27 01:28 发表
楼主其实需要的不是修改free函数的实现,而是在您的特定的工程里,可以检查出是否所有所有free后面都有置null。
那么可以用一个perl脚本做全局检查,编译前扫描一遍(所谓的代码走查)。
要不要修改free是一 ...
原帖由 sinall 于 2009-11-27 09:10 发表
楼主,想必经济学十大原理可以回答您的问题。
“人们面临权衡取舍”
关于作出决策的第一课可以归纳为一句谚语:“天下没有白吃的午餐。”为了得到我们喜爱的一件东西,通常就不得不放弃另一件我们喜爱的东西。作出决策要求我们在一个目标与另一个目标之间有所取舍。
也可以从哲学的角度看看这个问题。
“矛盾时时处处存在”
矛盾中的双方,对立、斗争、作用、转换。
这就是为什么后来的Java、C#之类的语言解决了你的问题。
原帖由 souldemo 于 2009-11-27 15:46 发表
对于你这种变态的需求,
建议你定义一个宏,
#define FREE(ptr) do { free(ptr); ptr = NULL;} while(0)
这样应该可以了。
原帖由 shan_ghost 于 2009-11-27 15:54 发表
想全自动的话可以用VB
不过,当年的VB为了初学者方便到处修扶手,后果是混乱到连微软自己都受不了,以至于从VS.NET开始彻底重做,又把扶手全拆了。
我当年维护过十几万行的TCL工程,后果是被这种语言的诸 ...
原帖由 lemoncookie 于 2009-11-27 18:32 发表
不算复杂的一个问题
结果说什么的都有
“野指针”本身就是一个不严格的“野”说法,简单地就认为是指向已经释放的内存空间的指针吧
问题是,当前程序中有多少个指针指向这个释放的空间?(包括不指向头部, ...
1.增加系统额外开销。
原来在free函数里面,p是在栈里面的数据,在执行到free以后,这个值基本上都是在cache里面进行缓冲;
修改后,访问内存变成二级内存访问,首先访问栈里面的p,然后根据p里面的内容作为地址再访问内存,这部分内存有可能不在cache中,执行完free以后,还需要把这块数据回写到内存。
由于free被执行的非常频繁,所以这些额外的系统开销也是需要考虑的。
2.修改后,增加了free执行出错的可能,因为p有可能指向一个非法地址,所以free函数执行的时候有可能出现非法内存访问错误。
3.由于C里面允许多个指针变量指向同一个地址,对于初学者来说,free以后,那些情况下应该将指针置NULL,那些情况下不用将指针置NULL将会变成一个噩梦。
来这里讨论的大部分都是有经验的程序员,至少对C语言还比较熟悉,觉得改变一下也不是不能适应。但是老师教学生的时候,就会变得非常复杂。
现在,只要说free以后,不会将指针置NULL,需要程序员手工来置NULL。
修改后呢,老师要花费很多时间,一一举例,说明那些情况下,free一块内存以后,不需要将指针置NULL,那些情况下,free以后需要将内存置NULL。
4.即使是有经验的程序员,在使用free的时候也需要非常谨慎。
在稍微复杂一点儿的项目里面,各种数据结构中,都会用到指针变量,偶尔也会出现多个指针指向同一个内存地址的情况,而且为了简化代码,很多时候会用一个指针变量来代替直接使用一个结构的指针,例如
struct CC c = b->a;
然后使用c变量来完成各个操作,在释放的时候,也是free(c);b->a=NULL;
如果修改以后,每次free的时候,同样要考虑很多事情,free里面的参数要使用那个变量,还有没有其他变量指向这个地址,需要在free的时候置NULL。
至少我认为现在的方式,我有free以后,会考虑一下那些值需要设置NULL的习惯。如果大部分时间不需要设置NULL,只有在极少部分的情况下需要设置NULL,我估计不会养成free的时候思考这些问题的习惯。
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |