免费(ptr)其中ptr是NULL损坏的内存?
理论上我可以这样说
free(ptr); free(ptr);
由于我们释放已经释放的内存,所以是内存损坏。
但是,如果
free(ptr); ptr=NULL; free(ptr);
由于操作系统的行为不确定,我无法对此进行实际的理论分析。 无论我在做什么,这个记忆腐败与否?
释放空指针是否有效?
7.20.3.2
free
function概要
#include <stdlib.h> void free(void *ptr);
描述
free
函数使ptr
指向的空间被释放,也就是说,可用于进一步的分配。 如果ptr
是空指针,则不会发生任何操作。
参见ISO-IEC 9899 。
这就是说,当在不同的代码库在野外,你会注意到有时候人们会这样做:
if (ptr) free(ptr);
这是因为一些C运行时(当然我记得它是PalmOS上的情况)释放NULL
指针时会崩溃。
但是现在,我认为按照标准的说明,假设free(NULL)
是一个nop是安全的。
所有符合标准的C库版本都将免费(NULL)视为无操作。
也就是说,有一段时间有免费的版本可以免费(NULL),这就是为什么你可能会看到一些防御性编程技术的build议:
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.
当free()
指针设置为NULL
,你可以再次调用free()
,并且不会执行任何操作。
在C语言中, free(NULL)
是完全合法的,而且在C ++中delete (void *)0
和delete[] (void *)0
是合法的。
顺便说一句,释放内存两次通常会导致某种运行时错误,所以它不会破坏任何东西。
没有内存腐败,但行为取决于实施。 按照标准,它应该是一个合法的代码。
如果ptr为NULL,则free(ptr)保存在C中,但是,大多数人不知道的是NULL不一定等于0.我有一个很好的守旧的例子:在C64的地址0上,是一个IO端口。 如果你用C写了一个程序访问这个端口,那么你需要一个指针,它的值为0.相应的c库将不得不区分0和NULL。
亲切的问候
ptr指向一些内存位置,比如说0x100。
当你释放(ptr)时,基本上你允许内存pipe理器使用0x100来用于其他活动或进程,简而言之就是释放资源。
当你做ptr = NULL时,你正在使ptr指向新的位置(不用担心NULL是什么)。 这样做,你失去了0x100内存数据的轨道。这就是内存泄漏。
所以不build议在有效的ptr上使用ptr = NULL。
相反,你可以做一些安全检查使用:
if(ptr!= NULL){free(ptr);}
当你释放(ptr)ptr已经指向NULL时,它不执行任何操作。因此,它的安全性是这样做的。