139

理论上我可以这么说

free(ptr);
free(ptr); 

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

但是如果

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

由于操作系统将以未定义的方式运行,因此我无法对正在发生的事情进行实际的理论分析。无论我在做什么,这是否是内存损坏?

释放 NULL 指针是否有效?

4

10 回答 10

252

7.20.3.2free功能

概要

#include <stdlib.h> 
void free(void *ptr); 

描述

free函数使 所指向的空间ptr被释放,也就是说,可用于进一步分配。如果ptr是空指针,则不执行任何操作。

参见ISO-IEC 9899

话虽如此,当查看不同的代码库时,您会注意到人们有时会这样做:

if (ptr)
  free(ptr);

这是因为某些 C 运行时(我肯定记得在 PalmOS 上就是这种情况)在释放NULL指针时会崩溃。

但是现在,我相信可以安全地假设free(NULL)按照标准的指示是 nop。

于 2009-12-21T07:50:33.410 回答
27

所有符合标准的 C 库版本都将 free(NULL) 视为无操作。

也就是说,曾经有一些版本的 free 会在 free(NULL) 上崩溃,这就是为什么你可能会看到一些防御性编程技术推荐的原因:

if (ptr != NULL)
    free(ptr);
于 2009-12-21T08:02:07.740 回答
13

如果 ptr 为 NULL,则不执行任何操作。

文件说。

于 2009-12-21T07:46:52.467 回答
12

free(NULL)我记得在崩溃的 PalmOS 上工作。

于 2009-12-27T12:43:12.097 回答
8
free(ptr);
ptr=NULL;
free(ptr);/*This is perfectly safe */

您可以安全地删除 NULL 指针。在这种情况下不会执行任何操作。换句话说,free() 不会对 NULL 指针执行任何操作。

于 2009-12-21T07:47:43.447 回答
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.

当您将指针设置为NULLafter时,free()您可以再次调用free()它,并且不会执行任何操作。

于 2009-12-21T08:38:41.390 回答
7

free(NULL)在 C 中是完全合法的,在 C++ 中delete (void *)0也是delete[] (void *)0合法的。

顺便说一句,两次释放内存通常会导致某种运行时错误,因此它不会损坏任何东西。

于 2009-12-21T07:47:39.047 回答
4

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

亲切的问候。

于 2017-10-19T08:39:06.833 回答
1

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

于 2009-12-21T07:45:08.657 回答
-4

ptr 指向某个内存位置,比如说 0x100。

当您释放(ptr)时,基本上您允许内存管理器将 0x100 用于其他活动或进程,简而言之,它是资源的释放。

当您执行 ptr=NULL 时,您正在使 ptr 指向新位置(不用担心 NULL 是什么)。这样做你丢失了 0x100 内存数据的踪迹。这就是内存泄漏。

因此不建议在有效的 ptr 上使用 ptr=NULL。

相反,您可以使用以下方法进行一些安全检查:

如果(ptr!= NULL){免费(ptr);}

当您释放 ptr 已经指向 NULL 的位置时,它不执行任何操作。因此,这样做是安全的。

于 2015-09-10T14:15:29.300 回答