从理论上讲,我可以这么说
free(ptr); free(ptr);
是一个内存损坏,因为我们释放已经释放的内存.
但是如果
free(ptr); ptr=NULL; free(ptr);
由于操作系统将以不确定的方式运行,我无法对此进行实际的理论分析.无论我在做什么,这种记忆是否会腐败?
释放空指针有效吗?
7.20.3.2
free
功能概要
#includevoid free(void *ptr); 描述
该
free
函数使得指向的空间ptr
被释放,即可用于进一步分配.如果ptr
是空指针,则不执行任何操作.
见ISO-IEC 9899.
话虽这么说,当你在野外查看不同的代码库时,你会注意到人们有时会这样做:
if (ptr) free(ptr);
这是因为一些C运行时(我肯定记得在PalmOS上就是这种情况)在释放NULL
指针时会崩溃.
但是现在,我认为free(NULL)
根据标准的指示,假设是一个nop是安全的.
所有符合标准的C库版本都将free(NULL)视为no-op.
也就是说,曾经有一些版本的免费版本会免费崩溃(NULL),这就是为什么你会看到一些防御性编程技巧的建议:
if (ptr != NULL) free(ptr);
如果ptr为NULL,则不执行任何操作.
说文件.
我记得在PalmOS上工作过free(NULL)
.
free(ptr); ptr=NULL; free(ptr);/*This is perfectly safe */
您可以安全地删除NULL指针.在这种情况下不会执行任何操作.换句话说,free()对NULL指针不执行任何操作.
推荐用法:
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()
再次调用它并且不执行任何操作.
free(NULL)
在C语言中是完全合法的,delete (void *)0
并且delete[] (void *)0
在C++中是合法的.
顺便说一下,释放内存两次通常会导致某种运行时错误,所以它不会破坏任何东西.