释放一个空指针
如果我们尝试释放指向NULL的指针,内存中会发生什么? 这有效吗?
为什么不显示任何警告/错误消息?
从C99第7.20.3.2节: 免费function
概要
1 #include <stdlib.h> void free(void *ptr);
描述
2自由函数使ptr指向的空间被释放,即可用于进一步分配。 如果ptr是空指针,则不会发生任何操作 。
来自http://linux.die.net/man/3/malloc :
如果ptr为NULL,则不执行任何操作。
释放空指针在执行中将不起作用。
从前很久以前,有一些free()的实现在空指针空闲时崩溃。 这只适用于在C89(C90)标准出厂前还没有被修改来处理问题的实现。
根据我的经验,这些实现基本上没有剩下(也不应该有),所以释放空指针现在是安全的。
如果你有任何要求进入非常古怪的系统,那么也许你应该保持谨慎。 另一方面,如果你有这样的系统担心,你可能会知道这个问题(还有其他一些问题) – 或者在代码周围会有一些共同的知识来表明这一点。
我会去的:
#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
; – ||
如果我们试图释放指向NULL的指针,内存中会发生什么。 是有效的吗?
没有。
为什么不显示任何警告/错误信息?
首先,行为是有效的定义,所以没有错误或警告需要发出。
其次,一个指针在运行时指向NULL。 如何显示警告或错误信息? 想象一下,你正在玩一个名为“杀死僵尸”的游戏,而其中两个正在攻击你,一个popup的错误消息出现,说:“警告,空指针释放。
这可能是安全的(我不知道,但其他答案似乎暗示),但我不会养成不关心指针是否已经为空的习惯。 赋值p = NULL;
每一次自由之后都会随之而来。 这在multithreading应用程序中是很危险的,因为在这个赋值之后, p
可能会被另一个线程使用,并且会被当前线程再次释放,而其他线程则会被其他线程释放。
每个malloc的内存应该释放一次。 期。