4

私はCを初めて使用します。malloc+無料に慣れようとしています。次のテストをコーディングしましたが、何らかの理由でメモリが完全に解放されていません(上部にはまだ約150MBのメモリが処理に割り当てられていることが示されています)。何故ですか?

#include <stdio.h>
#include <malloc.h>

typedef struct {
    char *inner;
} structure;

int main()
{
    int i;
    structure** structureArray;

    structureArray = (structure**)malloc(sizeof(structure*)*1000*10000);
    for (i = 0; i < 1000*10000;i++)
    {
        structureArray[i] = (structure*) malloc(sizeof(structure));
        structureArray[i]->inner = (char*) malloc(sizeof(char)*1000*1000*1000);
    }

    printf("freeing memory");
    for (i = 0; i < 1000*10000;i++)
    {
        free(structureArray[i]->inner);
        free(structureArray[i]);
    }
    free(structureArray);

    system("sleep 100");
    return 0;
}

対応するMakefile:

all: test.c
    gcc -o test test.c
    ./test &
    top -p `pidof ./test`
    killall ./test
4

3 に答える 3

11

topプロセスに割り当てられた物理メモリの量がわかります。仮想メモリは、物理メモリの上に抽象化されたものであり、malloc/freeその上に抽象化を提供します。

mallocプログラムのヒープからスペースを予約します。ヒープは、プログラムの仮想アドレス空間が一時ストレージに使用される領域です。さらに呼び出すと、システムコールmallocを使用してヒープが拡張されます。brkただし、ヒープの仮想サイズは増加しますが、物理メモリは、新しく割り当てられたメモリに対して読み取りまたは書き込みを行うまで、実際には割り当てられません。たとえば、innerレコードのフィールドに割り当てられたメモリに書き込むことは決してないため、これらの割り当ては物理RAMを占有しません。

freeによって割り当てられたヒープの一部を解放するだけmallocです。これは必ずしもヒープの仮想サイズを縮小するわけではないため、ヒープに関連付けられている物理メモリが解放されない場合があります。これが、物理メモリ使用量の削減が見られない理由です。

于 2009-11-14T21:39:13.030 に答える
6

Unixのメモリ管理は怠惰であり、誰かが本当にそれを必要としない限り、プロセスメモリを解放することは保証されません。ここに良い記事があります。

また、malloc()の結果を確認することをお勧めします。間違いなく、少なくともいくつかは失敗していることがわかります。

于 2009-11-14T21:28:37.563 に答える
3

おそらく、10000000000000000バイト(1000 * 10000 * 1000 * 1000 * 1000)=〜10000000000 Mbytes =10000000Gbytesのオーダーを割り当てたことが原因です。これはシステムメモリを複数回ラップします。

于 2009-11-14T21:24:49.053 に答える