1

free() の動作について質問があります。

malloc と strcpy a 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 に答える