8

この質問はインタビューで私に尋ねられました。

char * p = malloc(n)がnを超えるメモリを割り当て、たとえばNバイトのメモリが割り当てられ、free(p)を使用してpに割り当てられたメモリを解放するとします。

ヒープマネージャはそのような誤った割り当てを実行できますか?今何が起こりますか、nバイトが解放されますか、それともNバイトが解放されますか?

解放されたメモリの量を見つける方法はありますか?

編集

解放されたメモリの量を見つける方法はありますか?

何もないよりマシ、

mallinfo()は、「FredLarson」が指摘するようにいくつかの光を当てることができます

4

5 に答える 5

8

はい、それはあなたがするほとんどの場合に起こることですmalloc()。ブロックヘッダーには、mallocブロックのサイズに関する情報が含まれており、free()が呼び出されると、その量がヒープに返されます。故障ではなく、期待通りの動作です。

単純な実装では、たとえば、返されたポインタの直前のスペースにブロックのサイズだけを格納できます。次に、free()次のようになります。

void free(void *ptr)
{
    size_t *size = (size_t *)ptr - 1;

    return_to_heap(ptr, *size);
}

ここreturn_to_heap()で使用されるのは、将来の使用のために、指定されたメモリブロックをヒープに戻す実際の作業を行う関数を意味します。

于 2010-02-25T17:59:33.307 に答える
4

はい、ヒープマネージャはnバイトを超えるブロックを返すことができます。を使用して返されたポインタを解放することは完全に安全であり(そして必須です!)、freeすべてfreeの割り当てを解除します。

多くのヒープ実装は、メタデータのブロックをヒープに挿入することにより、割り当てを追跡します。 freeそのメタデータを探して、割り当てを解除するメモリの量を決定します。ただし、これは実装固有であるため、どれだけの金額が得られたかを知る方法mallocはなく、通常は気にする必要はありません。

于 2010-02-25T17:59:31.403 に答える
1

他の回答は、ブロックサイズがどのように処理されるかをよく説明しています。解放されたメモリの量を調べるために、私が考えることができる唯一の解決策は、解放のmallinfo()前後に呼び出すことです。

于 2010-02-25T18:17:33.860 に答える
1

通常、ヒープマネージャは割り当てられたものをすべて解放します。この情報をどこかに保存し、free()が呼び出されたときに検索します。

ヒープマネージャは、要求されたよりも多くのメモリを割り当てる場合、「障害」ではありません。ヒープマネージャーは多くの場合、固定ブロックサイズで動作し、要求を満たすときに次の適切なブロックサイズに切り上げます。ヒープマネージャーの仕事は可能な限り効率的にすることであり、多くの場合、大きな効率はいくつかの小さな非効率から生じます。

于 2010-02-25T18:00:02.337 に答える
1

これはmallocのデフォルトの動作です。NULL少なくとも要求したものと同じ長さのメモリのセクションに戻るか、ポインタを返します。したがって、yes freeは、要求されたものよりも長くメモリを取り除くことを処理できなければなりません。

実際に解放または割り当てられたメモリの量を確認することは、プラットフォーム固有の質問です。

于 2010-02-25T18:00:18.953 に答える