free() 释放的内存中的数据会怎样?

What happens to the data in memory deallocated by free()?

刚刚被 free() 释放的内存位置中的数据会怎样?该数据是否也被删除并且内存现在将具有垃圾值?或者该数据仍然存在,直到新数据存储在该内存位置(将来)?

我的意思是,对于下面的代码:

int *ptr;
ptr = malloc(sizeof(int));
*ptr = 1;
 // Suppose ptr = 2000
 //Free now
free(ptr);
// My question is what is the value stored in memory address 2000 now ?
// Is it still '1' or some garbage value ?

这取决于编译器。如果您使用的是 gcc,那么在该内存的空闲值变为 0 之后。

这是一个示例代码:

#include<stdio.h>
#include<stdlib.h>

int main ( void )
{
        int *ptr = NULL;
        ptr = malloc (sizeof(int));
        *ptr = 5;
        printf ( "\n value of *ptr = %d", *ptr );
        free ( ptr );
        printf ( "\n value of *ptr = %d", *ptr );

        return ( 0 );
}

o/p:

./a.out

 value of *ptr = 5
 value of *ptr = 0

 ./a.out

 value of *ptr = 5
 value of *ptr = 0

./a.out

 value of *ptr = 5
 value of *ptr = 0

取消引用 freed 指针会导致未定义的行为,这意味着允许发生任何事情。

您很可能会得到一些垃圾值,但您也可能会触发分段错误,这会使您的程序崩溃。即便如此,这些行为都不能保证,您不应该依赖它们。

结果难料。有几种可能发生的选择。关键是你不能依赖 free()

释放的内存的任何行为

一些示例:

  • 内存可以不动(保持原样,数据相同)
  • 它可以给另一个内存分配,在这种情况下它可以在任何时候被覆盖。
  • 可以清零
  • 包含内存的页面可以返回到 OS,将其从进程的内存映射中删除,如果您尝试访问它会使程序崩溃。

是否覆盖该值未定义。一旦 free 被调用,它就可以保留内存原样或者它可以覆盖它,但是如果你对安全感兴趣,你应该在释放它之前自己覆盖它。说到释放,free 不必将内存还给操作系统,事实上在很多情况下它不会,而是保留分配给您的程序的内存,以便下次您call malloc 它可以简单地返回相同的内存并避免进行更多的系统调用,因为从操作系统分配内存所花费的时间通常被认为是资源使用效率低于程序保持分配的内存比它需要的多一点。

我知道使用 C free() 函数释放了使用的内存,但指针和内存中包含的值都没有被修改! free() 只告诉内存可以用于其他目的。 (可能是一些库实现清理释放的内存或指针值,但这不应该是标准的!)

我用 gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2

尝试了下面的代码
int main(void)
{
    int *i,j;

    i=malloc(100*sizeof(int));

    for(j=0;j<100;j++)
        i[j]=j+1;

    printf("%p %d\n",i,i[0]);

    free(i);

    printf("%p %d\n",i,i[0]);

    return 0;
}

输出结果(如我所料)是:

0x1de2010 1
0x1de2010 1

Malloc() 是一个库函数。答案取决于库的实现方式。

大多数(如果不是全部)mallocs 为返回的内存块添加一个头前缀。这个一般都会修改。

一些 mallocs 将尾部附加到内存块并向其写入内容。这用于检测缓冲区溢出。

一些 frees() 将用一些位模式覆盖写入返回的内存以检测后续写入。

有很多 mallocs 可供您下载并 link 与您的应用程序一起使用,因此您可以通过 link 在您的应用程序中使用您想要的 mallocs 来获得几乎任何您想要的行为。