一尘不染

free()是否会删除存储在动态分配的内存中的数据?

linux

我编写了一个简单的程序,在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()两次释放内存,则会生成核心转储。在手册页中,提到程序行为异常。但是我一直在获得核心转储。这种行为是否也取决于编译器?


阅读 789

收藏
2020-06-07

共1个答案

一尘不染

是否free()删除存储在动态分配的内存中的数据?

不,free只需释放其参数(指针)所指向的已分配空间。此函数接受指向先前分配的内存块的char指针,并释放它-即,将其添加到可能重新分配的空闲内存块列表中。
释放的内存不会以任何方式清除/擦除。

您不应取消引用释放的(悬空的)指针。标准说:

7.22.3.3免费功能:

[…]否则, 如果参数与内存管理函数先前返回的指针不匹配,或者如果通过调用freeor
释放了空间realloc,则该行为是undefined

上面的引用还指出,释放指针两次将调用 未定义的行为 。UB实施后,您可能会得到预期的意外结果。可能有程序崩溃或核心转储。

2020-06-07