为什么free()只将8个第一个字节设置为零?

我有一个关于free()行为的问题。

Juste一个使用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 

简单的代码来certificate:

 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 

有人有答案吗?

free()不需要清除内存,实际上它不应该因为这样做需要花费时间并覆盖缓存数据而没有普遍要求的好处。

当然允许将内部空间用于自己的目的。 你所看到的可能只是分配器跟踪空闲内存的副作用。

一个更好的问题是; 为什么你认为它应该做任何其他事情? 你在哪里找到关于free强制实施的文件? 它不存在,所以提出这样的问题毫无意义。

free只需将内存标记为已释放。 调用free后该内存块发生了什么变化未指定。


另外,这是UB:

 printf ("Content ptr : %s\n", ptr); printf ("Content ptr+8 : %s\n", ptr+8);