理论上我可以说
free(ptr);
free(ptr);
是内存损坏,因为我们正在释放已经释放的内存。
但是如果
free(ptr);
ptr=NULL;
free(ptr);
由于操作系统将以不确定的方式运行,我无法对此进行实际的理论分析。 无论我在做什么,这种记忆是否会腐败?
释放空指针有效吗?
答案 0 :(得分:207)
7.20.3.2
free
函数概要
#include <stdlib.h> void free(void *ptr);
描述
free
函数导致ptr
指向的空间被释放,即 可供进一步分配。如果ptr
是空指针,则不会发生任何操作。
请参阅ISO-IEC 9899。
话虽如此,当你在野外查看不同的代码库时,你会注意到人们有时会这样做:
if (ptr)
free(ptr);
这是因为在释放NULL
指针时,某些C运行时(我确实记得在PalmOS上就是这种情况)会崩溃。
但是现在,我认为根据标准的指示,假设free(NULL)
是一个nop是安全的。
答案 1 :(得分:19)
所有符合标准的C库版本都将free(NULL)视为无操作。
那就是说,曾经有一些版本的免费版本会免费崩溃(NULL),这就是为什么你会看到一些防御性编程技巧的建议:
if (ptr != NULL)
free(ptr);
答案 2 :(得分:11)
如果ptr为NULL,则不执行任何操作。
说文档。
答案 3 :(得分:10)
我记得在free(NULL)
崩溃的PalmOS上工作。
答案 4 :(得分:8)
free(ptr);
ptr=NULL;
free(ptr);/*This is perfectly safe */
您可以安全地删除NULL指针。在这种情况下不会执行任何操作。换句话说,free()对NULL指针不执行任何操作。
答案 5 :(得分:8)
推荐用法:
free(ptr);
ptr = NULL;
请参阅:
man free
The free() function deallocates the memory allocation pointed to by ptr.
If ptr is a NULL pointer, no operation is performed.
在NULL
之后将指针设置为free()
时,您可以再次呼叫free()
,并且不会执行任何操作。
答案 6 :(得分:6)
free(NULL)
在C中完全合法,delete (void *)0
和delete[] (void *)0
在C ++中是合法的。
答案 7 :(得分:2)
free(ptr)保存在C中,但是,大多数人不知道的是NULL不必等于0.我有一个很好的老派示例:在C64上,在地址0上,有一个IO端口。如果您在C中编写了一个访问此端口的程序,那么您需要一个值为0的指针。相应的c库必须区分0和NULL。
亲切的问候
答案 8 :(得分:0)
不是内存损坏,但行为取决于实现。 按照标准,它应该是一个合法的代码。