Free (ptr)其中 ptr 为 NULL 是否损坏内存?

理论上我可以这么说

free(ptr);
free(ptr);

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

但如果

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

由于操作系统将以一种未定义的方式运行,我不能得到一个实际的理论分析关于这发生了什么。 不管我在做什么,这是不是记忆受损了?

释放 NULL 指针有效吗?

101007 次浏览

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

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

文件上说。

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

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

free(ptr);
ptr=NULL;
free(ptr);/*This is perfectly safe */

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

7.20.3.2 free函数

大纲

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

描述

free函数使得由 ptr指向的空间被释放,即被释放 如果 ptr是空指针,则不执行任何操作。

参见 ISO-IEC9899

也就是说,当在野外查看不同的代码库时,你会注意到人们有时会这样做:

if (ptr)
free(ptr);

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

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

所有符合标准的 C 库版本都将 free (NULL)视为 no-op。

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

if (ptr != NULL)
free(ptr);

推荐用法:

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(),不执行任何操作。

我记得我在 PalmOS 工作的时候 free(NULL)崩溃了。

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

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

当执行 ptr = NULL 时,将使 ptr 指向新位置(不必担心 NULL 是什么)。这样做会丢失0x100内存数据的跟踪。这就是内存泄漏。

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

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

如果(ptr! = NULL) { free (ptr) ; }

当您释放 ptr 已经指向 NULL 的地方(ptr)时,它不执行任何操作。

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

问候你。