free()释放的内存中的数据会发生什么变化?

时间:2015-04-12 04:52:30

标签: c memory 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 ?

6 个答案:

答案 0 :(得分:4)

结果不可预测。有几种选择可以发生。关键是你不能依赖free()

发布的内存的任何行为

一些例子:

  • 内存可以不受影响(保持与相同数据相同)。
  • 可以给予另一个内存分配,在这种情况下,它可以随时写入。
  • 可以归零。
  • 包含内存的页面可以返回到操作系统,将其从进程的内存映射中删除,如果您尝试访问它,会导致程序崩溃。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

我知道使用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

答案 3 :(得分:1)

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

大多数(如果不是全部)mallocs将头标头添加到返回的内存块中。这通常会被修改。

一些malloc将预告片附加到内存块并向其写入内容。这用于检测缓冲区溢出。

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

有很多malloc可供您下载并与您的应用程序链接,因此您可以通过将您想要的malloc与您的应用程序链接来获得您想要的任何行为。

答案 4 :(得分:0)

这取决于编译器。如果你正在使用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

答案 5 :(得分:0)

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

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