理论上我可以这么说
free(ptr); free(ptr);
是内存损坏,因为我们正在释放已经释放的内存。
但如果
free(ptr); ptr=NULL; free(ptr);
由于操作系统将以一种未定义的方式运行,我不能得到一个实际的理论分析关于这发生了什么。 不管我在做什么,这是不是记忆受损了?
释放 NULL 指针有效吗?
不是内存损坏,而是行为取决于实现。 按照标准,它应该是一个法律代码。
如果 ptr 为 NULL,则不执行任何操作。
文件上说。
free(NULL)在 C 中是完全合法的,delete (void *)0和 delete[] (void *)0在 C + + 中也是合法的。
free(NULL)
delete (void *)0
delete[] (void *)0
顺便说一句,释放两次内存通常会导致某种运行时错误,所以它不会破坏任何东西。
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是空指针,则不执行任何操作。
7.20.3.2 free函数
free
大纲
#include <stdlib.h> void free(void *ptr);
描述
free函数使得由 ptr指向的空间被释放,即被释放 如果 ptr是空指针,则不执行任何操作。
ptr
参见 ISO-IEC9899。
也就是说,当在野外查看不同的代码库时,你会注意到人们有时会这样做:
if (ptr) free(ptr);
这是因为一些 C 运行时(我肯定记得在 PalmOS 上是这种情况)在释放 NULL指针时会崩溃。
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(),不执行任何操作。
free()
我记得我在 PalmOS 工作的时候 free(NULL)崩溃了。
Ptr 指向某个内存位置,比如0x100。
当您释放(ptr)时,基本上允许内存管理器将0x100用于其他活动或进程,简单来说就是资源释放。
当执行 ptr = NULL 时,将使 ptr 指向新位置(不必担心 NULL 是什么)。这样做会丢失0x100内存数据的跟踪。这就是内存泄漏。
因此,不建议在有效的 ptr 上使用 ptr = NULL。
相反,你可以使用以下方法进行一些安全检查:
如果(ptr! = NULL) { free (ptr) ; }
当您释放 ptr 已经指向 NULL 的地方(ptr)时,它不执行任何操作。
如果 ptr是 NULL,那么 free(ptr)保存在 C 中,但是大多数人不知道的是 NULL不一定等于0。我有一个很好的老式示例: 在 C64上,在地址0上,有一个 IO 端口。如果你用 C 写了一个访问这个端口的程序,你需要一个值为0的指针。相应的 C 库必须区分0和 NULL。
free(ptr)
问候你。