free()之后内存会怎样?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了free()之后内存会怎样?相关的知识,希望对你有一定的参考价值。

我知道在硬盘驱动器上,如果删除文件,数据不会(立即)消失。数据仍然存在,直到被覆盖。我想知道内存中是否存在类似的概念。假设我为一个字符串分配了256个字节,在free()之后,该字符串是否仍在内存中浮动,直到被覆盖为止?

答案

通常,它确实存在,除非您在free之前显式覆盖字符串(就像人们有时使用密码一样)。一些库的实现会自动覆盖释放的内存以捕获对其的访问,但是在释放模式下不会这样做。

另一答案

您的类比是正确的。内存中的数据不会消失或类似的东西;尽管尝试从已释放的内存中进行读取是未定义的行为,但free()之后的值实际上确实仍然存在。

另一答案

答案在很大程度上取决于实现。在一个好的实现中,很可能至少内存的开始(或结尾?)会被簿记信息覆盖,以跟踪空闲的内存块,这些内存块稍后可以重用。但是细节会有所不同。如果您的程序具有任何级别的并发性/线程(甚至在您可能看不到的库实现中),那么此类内存可能会被异步破坏,甚至可能甚至读取它也是危险的。当然,free的实现可能会完全从程序的虚拟地址空间中取消映射地址范围,在这种情况下,尝试对其执行任何操作都会使程序崩溃。

[从应用程序作者的角度出发,您应该仅根据规范对待free,并且永远不要访问释放的内存。但是从系统实现者或集成者的角度来看,了解(或设计)实现可能会很有用,在这种情况下,您的问题就很有趣。

另一答案

如果要验证实现的行为,下面的简单程序将为您完成此操作。

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

/* The number of memory bytes to test */
#define MEM_TEST_SIZE 256

void outputMem(unsigned char *mem, int length)
{
    int i;

    for (i = 0; i < length; i++) {
        printf("[%02d]", mem[i] );
    }   
}

int bytesChanged(unsigned char *mem, int length)
{
    int i;
    int count = 0;

    for (i = 0; i < MEM_TEST_SIZE; i++) {
        if (mem[i] != i % 256)
            count++;
    }
    return count;
}

main(void)
{
    int i;
    unsigned char *mem = (unsigned char *)malloc(MEM_TEST_SIZE);

    /* Fill memory with bytes */
    for (i = 0; i < MEM_TEST_SIZE; i++) {
        mem[i] = i % 256;
    }

    printf("After malloc and copy to new mem location
");
    printf("mem = %ld
", mem );
    printf("Contents of mem: ");
    outputMem(mem, MEM_TEST_SIZE);

    free(mem);
    printf("

After free()
");
    printf("mem = %ld
", mem );
    printf("Bytes changed in memory = %d
", bytesChanged(mem, MEM_TEST_SIZE) );
    printf("Contents of mem: ");
    outputMem(mem, MEM_TEST_SIZE);


}

以上是关于free()之后内存会怎样?的主要内容,如果未能解决你的问题,请参考以下文章

free(p),是啥意思?是单纯p==NULL还是说p指向的内容变为空。使用free()之后 p和内存的状态是啥情况的

为啥在使用 malloc() 和 free() 后,两个内存位置会发生变化?

C语言中, 为了避免野指针,是否可以在free和delete之后,把指针置为NULL就可以避免了?

在一台内存为2G的机器上,malloc(20G) 会怎样?如果是new(20G) 会怎样?

怎样正确查看Linux的内存占用情况

free() 是不是将内存清零?