1

我有一个关于 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

简单的代码来证明:

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

有人有答案吗?

4

2 回答 2

6

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

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

于 2013-02-17T00:24:52.733 回答
4

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

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


顺便说一句,这是UB:

printf ("Content ptr    : %s\n", ptr);
printf ("Content ptr+8 : %s\n", ptr+8);
于 2013-02-17T00:28:11.380 回答