从理论上讲,我可以说
free(ptr);
free(ptr);
由于我们正在释放已经被释放的内存,这是一种内存损坏。
但如果
free(ptr);
ptr=NULL;
free(ptr);
由于操作系统会以未定义的方式表现,因此我无法进行实际的理论分析来确定正在发生什么。 无论我做什么,这是内存损坏还是不是?
释放空指针是否有效?
从理论上讲,我可以说
free(ptr);
free(ptr);
由于我们正在释放已经被释放的内存,这是一种内存损坏。
但如果
free(ptr);
ptr=NULL;
free(ptr);
由于操作系统会以未定义的方式表现,因此我无法进行实际的理论分析来确定正在发生什么。 无论我做什么,这是内存损坏还是不是?
释放空指针是否有效?
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)
是一个空操作。
ptr
为空时调用free(ptr)
没有任何副作用。但是,在任何情况下,使用malloc()
或calloc()
分配的每个内存块都必须使用free()
释放。 - Gregory Pakoszfree()
之前通过将指针与 NULL
进行比较来避免使用 free(NULL)
。 - Gregory Pakosz所有符合标准的 C 库版本都将 free(NULL) 视为无操作。
尽管如此,曾经有一些版本的 free 在 free(NULL) 时会崩溃,这就是为什么你可能会看到一些防御性编程技巧建议:
if (ptr != NULL)
free(ptr);
我记得在PalmOS上工作时,free(NULL)
会导致崩溃。
NULL
是其中一个最大的运行差异之一。 - Steven Fisherfree
对应函数(MemPtrFree
)不符合标准,而free
被别名为MemPtrFree
,以提供类似标准的API(粗略尝试)。 - jamesdlinfree(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.
在使用free()
释放内存后,将指针设置为NULL
,再次调用free()
时不会执行任何操作。
free(NULL)
在C语言中是合法的,同样 delete (void *)0
和 delete[] (void *)0
在C++语言中也是合法的。
顺便提一下,多次释放内存通常会引起某种类型的运行时错误,但不会破坏任何东西。
delete 0
是不合法的。delete
关键字明确要求一个指针类型的表达式。将delete
应用于一个具有类型的空指针值是合法的,但不能应用于0
(也不能应用于NULL
)。 - AnT stands with Russiavoid*
:P 它应该运行哪些析构函数? - GManNickGvoid *
。 - AnT stands with Russiabuf1=malloc(X); free(buf1);buf2=malloc(X);free(buf1);
- 如果你运气不好,buf2的地址与buf1完全相同,你就会意外地两次释放buf1,在第二次释放buf1时,你实际上悄悄地释放了buf2,而没有引起任何(立即)错误/崩溃/等等。(但下次尝试使用buf2时,你仍然可能会遇到崩溃 - 如果你正在运行ASLR,则这种情况非常不可能发生)。 - hanshenrikptr
是NULL
,那么在C语言中使用free(ptr)
是安全的。然而,大多数人不知道的是,NULL
不一定等于0。我有一个很好的老派例子:在C64上,地址0处是一个IO端口。如果你在C语言中编写一个访问该端口的程序,你需要一个值为0的指针。相应的C库必须区分0和NULL
。祝好!不是内存损坏,而是行为取决于实现方式。 按照标准,它应该是合法的代码。
虽然现在很安全,但我总是使用以下宏来释放指针:
#define FREE(ptr) \
{ \
if ((ptr) != NULL) \
{ \
free(ptr); \
(ptr) = NULL; \
} \
}
ptr
指向内存,并且您没有调用free
释放它,那么内存将泄漏。将其设置为NULL
只是失去了对该内存的控制,并导致内存泄漏。如果ptr
恰好是NULL
,则调用free
不会有任何操作。 - GManNickG