free()之后内存会发生什么?

时间:2011-02-26 04:15:01

标签: c windows memory

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

4 个答案:

答案 0 :(得分:5)

通常情况下,它会保持不变,除非您在free之前明确覆盖该字符串(就像人们有时会使用密码一样)。某些库实现会自动覆盖已释放的内存以捕获对它的访问,但这不是在发布模式下完成的。

答案 1 :(得分:3)

你的比喻是正确的。内存中的数据不会消失或类似的东西;虽然尝试从释放的内存中读取未定义的行为,但是free()之后的值可能仍然存在。

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

如果您想验证实施的行为,下面的简单程序将为您完成。

#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\n");
    printf("mem = %ld\n", mem );
    printf("Contents of mem: ");
    outputMem(mem, MEM_TEST_SIZE);

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


}