释放空指针

时间:2010-03-01 08:49:51

标签: c pointers

如果我们尝试释放指向NULL的指针,内存会发生什么? 这有效吗?

为什么不显示任何警告/错误消息?

7 个答案:

答案 0 :(得分:54)

来自C99第7.20.3.2节:免费功能

<强>概要

 1 #include <stdlib.h>
   void free(void *ptr);

<强>描述

  

2 free函数导致ptr指向的空间被释放,即被释放   可供进一步分配。 如果ptr是空指针,则不会执行任何操作

答案 1 :(得分:14)

来自http://linux.die.net/man/3/malloc

  

如果ptr为NULL,则不执行任何操作。

答案 2 :(得分:6)

  

释放空指针对执行没有影响。

答案 3 :(得分:5)

我会去:

#ifdef MY_DOUBTS_HAUNT_ME_IN_MY_DREAMS
    #define safe_free(x) do { if ((x)) free((x)); } while(0)
#elseif /* feeling gutsy */
    #define safe_free(x) free((x))
#endif

- ||

答案 4 :(得分:5)

很久以前,有一个'free()'的实现在给出空指针时崩溃了。这仅适用于C89(C90)标准之前的实现,该标准尚未经过修改以解决此问题。

根据我的经验,基本上没有任何实现(也不应该存在),因此现在可以安全地释放空指针。

如果您有任何要求移植到非常奇怪和古老的系统,那么也许您应该保持谨慎。另一方面,如果你有这样的系统需要担心,你可能知道这个问题(以及一大堆其他问题) - 或者在代码中有一些公共知识来表明这一点。

答案 5 :(得分:2)

  

如果我们尝试,内存会发生什么   释放指向的指针   空值。这有效吗?

没有

  

为什么它没有显示任何警告/错误   消息?

首先,行为按定义有效,因此不需要发出错误或警告。

其次,指针在运行时指向NULL。如果有的话,应该如何显示警告或错误消息?想象一下,你正在玩一款名为Kill the Zombie的游戏,当其中两个生物攻击你时,会出现一条弹出错误信息,上面写着:“警告,NULL指针被释放。”

答案 6 :(得分:1)

它可能是安全的(我不知道,但其他答案似乎暗示了这一点),但我不会养成不关心指针是否已经为空的习惯。每次免费之后的作业p = NULL;很快就会成为必然结果。这在多线程应用程序中是危险的,因为在此赋值之后,p可能被另一个线程使用,并且当前线程将被其他线程活着时再次释放。

每个malloc的内存应该被释放一次。期。