免费(ptr)其中ptr是NULL损坏的内存?

理论上我可以这样说

free(ptr); free(ptr); 

由于我们释放已经释放的内存,所以是内存损坏。

但是,如果

 free(ptr); ptr=NULL; free(ptr); 

由于操作系统的行为不确定,我无法对此进行实际的理论分析。 无论我在做什么,这个记忆腐败与否?

释放空指针是否有效?

7.20.3.2 freefunction

概要

 #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 *)0delete[] (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时,它不执行任何操作。因此,它的安全性是这样做的。