我编写了一个简单的程序,在free()之后测试动态分配的内存的内容,如下所示。(我知道释放后我们不应该访问该内存。我编写此代码是为了检查释放后内存中将存在什么)
#include <stdio.h> #include <stdlib.h> main() { int *p = (int *)malloc(sizeof(int)); *p = 3; printf("%d\n", *p); free(p); printf("%d\n", *p); }
输出:3 0
我以为它将通过第二个打印语句打印垃圾值或崩溃。但是它总是打印0。
1)这种行为是否取决于编译器?
2)如果我尝试使用free()两次释放内存,则会生成核心转储。在手册页中,提到程序行为异常。但是我一直在获得核心转储。这种行为是否也取决于编译器?
是否free()删除存储在动态分配的内存中的数据?
free()
不,free只需释放其参数(指针)所指向的已分配空间。此函数接受指向先前分配的内存块的char指针,并释放它-即,将其添加到可能重新分配的空闲内存块列表中。 释放的内存不会以任何方式清除/擦除。
free
您不应取消引用释放的(悬空的)指针。标准说:
[…]否则, 如果参数与内存管理函数先前返回的指针不匹配,或者如果通过调用freeor 释放了空间realloc,则该行为是undefined。
realloc
上面的引用还指出,释放指针两次将调用 未定义的行为 。UB实施后,您可能会得到预期的意外结果。可能有程序崩溃或核心转储。