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