如果我们尝试释放指向NULL的指针,内存会发生什么? 这有效吗?
为什么不显示任何警告/错误消息?
答案 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的内存应该被释放一次。期。