ptr为NULL的free(ptr)是否会损坏内存?

时间:2009-12-21 07:43:59

标签: c pointers null free

理论上我可以说

free(ptr);
free(ptr); 

是内存损坏,因为我们正在释放已经释放的内存。

但是如果

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

由于操作系统将以不确定的方式运行,我无法对此进行实际的理论分析。 无论我在做什么,这种记忆是否会腐败?

释放空指针有效吗?

9 个答案:

答案 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 *)0delete[] (void *)0在C ++中是合法的。

BTW,两次释放内存通常会导致某种运行时错误,所以它不会破坏任何内容。

答案 7 :(得分:2)

如果ptr为NULL,

free(ptr)保存在C中,但是,大多数人不知道的是NULL不必等于0.我有一个很好的老派示例:在C64上,在地址0上,有一个IO端口。如果您在C中编写了一个访问此端口的程序,那么您需要一个值为0的指针。相应的c库必须区分0和NULL。

亲切的问候

答案 8 :(得分:0)

不是内存损坏,但行为取决于实现。 按照标准,它应该是一个合法的代码。