理论上我可以这么说
free(ptr);
free(ptr);
是内存损坏,因为我们正在释放已经释放的内存。
但是如果
free(ptr);
ptr=NULL;
free(ptr);
由于操作系统将以未定义的方式运行,因此我无法对正在发生的事情进行实际的理论分析。无论我在做什么,这是否是内存损坏?
释放 NULL 指针是否有效?
理论上我可以这么说
free(ptr);
free(ptr);
是内存损坏,因为我们正在释放已经释放的内存。
但是如果
free(ptr);
ptr=NULL;
free(ptr);
由于操作系统将以未定义的方式运行,因此我无法对正在发生的事情进行实际的理论分析。无论我在做什么,这是否是内存损坏?
释放 NULL 指针是否有效?
7.20.3.2
free
功能概要
#include <stdlib.h> void free(void *ptr);
描述
该
free
函数使 所指向的空间ptr
被释放,也就是说,可用于进一步分配。如果ptr
是空指针,则不执行任何操作。
参见ISO-IEC 9899。
话虽如此,当查看不同的代码库时,您会注意到人们有时会这样做:
if (ptr)
free(ptr);
这是因为某些 C 运行时(我肯定记得在 PalmOS 上就是这种情况)在释放NULL
指针时会崩溃。
但是现在,我相信可以安全地假设free(NULL)
按照标准的指示是 nop。
所有符合标准的 C 库版本都将 free(NULL) 视为无操作。
也就是说,曾经有一些版本的 free 会在 free(NULL) 上崩溃,这就是为什么你可能会看到一些防御性编程技术推荐的原因:
if (ptr != NULL)
free(ptr);
如果 ptr 为 NULL,则不执行任何操作。
文件说。
free(NULL)
我记得在崩溃的 PalmOS 上工作。
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.
当您将指针设置为NULL
after时,free()
您可以再次调用free()
它,并且不会执行任何操作。
free(NULL)
在 C 中是完全合法的,在 C++ 中delete (void *)0
也是delete[] (void *)0
合法的。
顺便说一句,两次释放内存通常会导致某种运行时错误,因此它不会损坏任何东西。
free(ptr)
ptr
如果is保存在 C中NULL
,但是,大多数人不知道的是NULL
不一定等于 0。我有一个很好的老派示例:在 C64 上,地址 0 上有一个 IO-Port。如果您用 C 语言编写程序访问此端口,则需要一个值为 0 的指针。相应的 C 库必须区分 0 和NULL
then。
亲切的问候。
不是内存损坏,而是行为取决于实现。按照标准,它应该是一个法律代码。
ptr 指向某个内存位置,比如说 0x100。
当您释放(ptr)时,基本上您允许内存管理器将 0x100 用于其他活动或进程,简而言之,它是资源的释放。
当您执行 ptr=NULL 时,您正在使 ptr 指向新位置(不用担心 NULL 是什么)。这样做你丢失了 0x100 内存数据的踪迹。这就是内存泄漏。
因此不建议在有效的 ptr 上使用 ptr=NULL。
相反,您可以使用以下方法进行一些安全检查:
如果(ptr!= NULL){免费(ptr);}
当您释放 ptr 已经指向 NULL 的位置时,它不执行任何操作。因此,这样做是安全的。