Chinaunix

标题: 指针用完后用不用把它置NULL [打印本页]

作者: kingoftime3    时间: 2010-07-02 08:54
标题: 指针用完后用不用把它置NULL
在很多正规的程序里发现并没有这么做,系统自动回收野指针吗?
作者: hellioncu    时间: 2010-07-02 08:57
一般不需要,用完free就行,当然你愿意多写一句=NULL也可以。
作者: kmindg    时间: 2010-07-02 09:11
free后 写=NULL   只是保险起见吧 不是必须的
   看要不要求了
作者: creatory    时间: 2010-07-02 09:20
用完了,最好这样设置,避免了野指针的出现,否则下次if(ptr==NULL)这样判断的时候就会出错了。
作者: rufeng18    时间: 2010-07-02 09:21
最好养成好习惯,还是赋值为NULL
不赋值为如果以后你遇到这个指针,你无法知道这个指针是否可用
我们一般是先这样判断 if(p != NULL)
没强制要求,不过是好习惯
作者: rain_fish    时间: 2010-07-02 09:22
需要,好习惯
作者: donglongchao    时间: 2010-07-02 09:26
如果以后你需要简单判断这个对象是不是还存在,可能会用到这个指针。
作者: proghua    时间: 2010-07-02 09:55
本帖最后由 proghua 于 2010-07-02 10:12 编辑

C++ primer
Setting the pointer to 0 after the object it refers to has been deleted makes it clear that the pointer points to no object.

作者: tajial    时间: 2010-07-02 10:15
脱裤子放屁
作者: wmmy2008    时间: 2010-07-02 10:20
全局指针的话最好这样赋NULL ,
作者: 俺小时候可帅了    时间: 2010-07-02 10:22

free(ptr);
ptr = NULL;
作者: brynx    时间: 2010-07-02 10:25
好习惯
作者: ahocat    时间: 2010-07-02 10:26
理论上不用。
实际还是赋NULL比较保险,否则万一哪里不注意又去用了那个指针很难发现。
作者: BMW_325i    时间: 2010-07-02 16:32
好习惯,需要!!
作者: langue    时间: 2010-07-02 22:22
之前有过讨论,正确的用法是不再使用被 free() 的指针。

存储空间被释放后,指向该区域的指针不再具有意义。

无论处于什么样的情况下,只要任何一个条件使得你的代码在 free(ptr) 之后继续跟 ptr 打交道,是 if (ptr != NULL) 也好,是 ptr[s] = '\0' 也罢,只要继续在用这个指针,就表明你的代码里存在错误。编写正确的代码是正道,而掩盖错误只会导致代码中的问题越积越多。
作者: klanet    时间: 2010-07-02 22:27
一般来说都会这样做
作者: xinglp    时间: 2010-07-02 22:27
free(p);
p=NULL;
free(p);//这里不会出错,正确的做法是让这个错误曝露出来,除非你的逻辑需要用p是否为NULL做判断,
作者: bruceteen    时间: 2010-07-03 01:46
顶 tajial、langue、xinglp 三位大侠,兄弟我和诸位 英雄所见皆雷同^_^,置NULL是一种恶习

proghua引用《C++ primer》的话看起来也是蛮够分量的,但俺鄙视那作者(当然,你也可以鄙视俺,说俺不自量力),C++阵营中俺最鄙视的就是它,纯一傻鸟,却占着C++的高位,不除掉这家伙,C++说不定会给它带入歧途,变成一个三流开发语言。
作者: networkdev    时间: 2010-07-03 13:58
回复 1# kingoftime3


    最后设置
作者: bluesea666    时间: 2010-07-03 14:26
学习大家乐.

很相信自己的人不会置NULL?
作风严谨的人会置NULL ?
作者: mirnshi    时间: 2010-07-03 15:54
这个话题已经被讨论多次了。这个动作类似每次锁门后,都要拧下把手再次确认门是否确实锁上了。
作者: RobinKQin    时间: 2010-07-03 17:32
这个话题已经被讨论多次了。这个动作类似每次锁门后,都要拧下把手再次确认门是否确实锁上了。
mirnshi 发表于 2010-07-03 15:54



    支持,程序员贵在知道自己在做什么!浪费时间的事就不做了!
作者: ahocat    时间: 2010-07-03 19:13
本帖最后由 ahocat 于 2010-07-03 19:16 编辑
之前有过讨论,正确的用法是不再使用被 free() 的指针。

存储空间被释放后,指向该区域的指针不再具有意 ...
langue 发表于 2010-07-02 22:22



    如果是并发系统的话,不先if (ptr != NULL)一下,你敢保证ptr是有效的吗?

现实世界太复杂,实际的应用可比书上的练习题复杂得多,自己先要保护好自己才是!
作者: ahocat    时间: 2010-07-03 19:15
回复 18# bruceteen


    不清楚你鄙视Lippman什么,但至少他的水平我一辈子也不敢鄙视。
作者: langue    时间: 2010-07-03 23:19
回复 23# ahocat

真奇怪。我为什么需要做这个保证?到了需要做保证这个地步,就表明原先的设计是失败的。

if (ptr != NULL) 是需要的,这是最基本的 sanity check,但这与指针对应的存储空间被释放后是否应该将指针置空无关。
作者: ahocat    时间: 2010-07-04 00:00
本帖最后由 ahocat 于 2010-07-04 00:04 编辑

回复 25# langue

你可以归罪于设计,而我说的是现实。现实中的大多数程序员都在为不是由自己设计的软件写代码,为本不是出于己手的代码做修改。你让这些程序员怎么办?

现实中的烂设计、遗留下来的烂代码太多了,不可能都回避得了。
作者: flw    时间: 2010-07-04 09:55
回复  langue

你可以归罪于设计,而我说的是现实。现实中的大多数程序员都在为不是由自己设计的软件写代 ...
ahocat 发表于 2010-07-04 00:00

你是说,你周围全是你这样的烂程序员遗留下的烂代码吗?
作者: guoruimin    时间: 2010-07-04 10:38
如果有人free后,置为NULL。
我会认为是有一定原因的,但这个原因不应该是判断是否释放过了。
如果逻辑上不需要,就不要多此一举,会让别人觉得很变态。

如果不这样做不行,就是逻辑设计的有问题。
作者: ahocat    时间: 2010-07-04 10:45
本帖最后由 ahocat 于 2010-07-04 10:50 编辑
你是说,你周围全是你这样的烂程序员遗留下的烂代码吗?
flw 发表于 2010-07-04 09:55



也许你运气好,没遇到过,那我很羡慕你。

我并没有说指针用完后不置NULL是错误的,只是大家的出发点不同,我是从现实情况出发,所以我也说了“理论上不需要”。

我只是想提醒一下楼主,现实中很多情况是由不得你做主的。并不都能用一句“那是设计的失败,我不需要为此负责”就能解决的。那些不得不为本不是自己设计、编写的代码负责的程序员不在少数。所以为了保险起见,像二十一楼所说的那样锁上门以后再拧一下把手,是最简单、可靠且有效的办法,这并不是什么丢脸的事。

如果你有条件、有能力、有时间精雕细琢的做出一个“完美的设计”,可以保证写出的代码不误用野指针,那当然很好,也很令人佩服。如果你没有把握,那还是NULL一下吧。我承认我是没有把握的。
作者: tracyjk1    时间: 2010-07-15 23:31
第一次接触,学习了




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2