我对free()行为有疑问。
使用malloc和strcpy作为char *的简单代码。所以,所有都是在HEAP上设置的:
(gdb) x/100b 0x602010
0x602010: 66 111 110 106 111 117 114 32
0x602018: 116 111 117 116 32 108 101 32
0x602020: 109 111 110 100 101 0 0 0
0x602028: 0 0 0 0 0 0 0 0
0x602030: 0 0 0 0 0 0 0 0
0x602038: 33 0 0 0 0 0 0 0
当我用free()释放块时,结果是:
(gdb) x/100b 0x602010
0x602010: 0 0 0 0 0 0 0 0
0x602018: 116 111 117 116 32 108 101 32
0x602020: 109 111 110 100 101 0 0 0
0x602028: 0 0 0 0 0 0 0 0
0x602030: 0 0 0 0 0 0 0 0
0x602038: 33 0 0 0 0 0 0 0
简单的代码来证明:
int main ()
{
const char * str = "Bonjour tout le monde";
char *ptr = (char *) malloc (strlen(str) + 1);
strcpy(ptr, str);
printf("*ptr : %s\n\n", ptr);
free(ptr);
printf ("After free ptr = %p\n", ptr);
printf ("Content ptr : %s\n", ptr);
printf ("Content ptr+8 : %s\n", ptr+8);
return 0;
}
输出:
*ptr : Bonjour tout le monde
After free ptr = 0x13c7010
Content ptr :
Content ptr+8 : tout le monde
有人有答案吗?
答案 0 :(得分:6)
free()
不需要清除内存,实际上它不应该这样做,因为这样做需要时间并覆盖缓存数据,因为没有普遍要求的好处。
当然可以将内部空间用于自己的目的。您所看到的可能只是分配器跟踪空闲内存的副作用。
答案 1 :(得分:4)
更好的问题是;为什么你认为它应该做任何其他事情?您在哪里找到有关free
的强制执行的文档?它不存在,所以提出这样的问题毫无意义。
free
只需将内存标记为已释放。 1}}调用free
后内存块会发生什么变化。
顺便说一下,这是UB:
printf ("Content ptr : %s\n", ptr);
printf ("Content ptr+8 : %s\n", ptr+8);