6

メモリの割り当てと割り当て解除のテストをいくつか行っています。これは私が使用しているコードです:

#include <stdlib.h>
#include <stdio.h>

#define WAVE_SIZE 100000000

int main(int argc,char* argv[]){

    int i;
    int **p;

    printf("%d allocs...\n",WAVE_SIZE);

    // Malloc
    printf("Allocating memory...\n");
    p = (int**)malloc(WAVE_SIZE*sizeof(int*));
    for(i = 0;i < WAVE_SIZE;i++)
            p[i] = (int*)malloc(sizeof(int));

    // Break
    printf("Press a key to continue...\n");
    scanf("%*s");

    // Dealloc
    printf("Deallocating memory...\n");
    for(i = 0;i < WAVE_SIZE;i++)
            free(p[i]);             
    free(p);

    // Break
    printf("Press a key to continue...\n");
    scanf("%*s");

    return 0;
}

休憩中に、プロセスで使用されている合計メモリを確認しましたが、期待どおりの結果が得られません。

最初の一時停止まで、メモリ消費量が増加しています。ただし、2 番目の一時停止では、リリースされていることがわかりません。

これはOSの問題ですか?マシンの負荷が高く、空きメモリがなく、別のプロセスが割り当てようとするとどうなりますか?

4

4 に答える 4

10

free必ずしもメモリをオペレーティングシステムに解放するわけではありません。ほとんどの場合、空きブロックのリストにそのメモリ領域を戻すだけです。これらの空きブロックは、への次の呼び出しで再利用できますmalloc

于 2013-02-28T15:33:14.213 に答える
6

メモリが割り当てられ、後で解放されると、そのメモリは引き続きプロセスに残りますが、空きとしてマークされるため、再度割り当てることができます。mallocこれは、そうしないと、またはを呼び出すたびにオペレーティング システムがプロセスの仮想メモリ マッピングを変更する必要がfreeあり、時間がかかるためです。

于 2013-02-28T15:34:58.467 に答える
2

free()プログラムがこのブロックをもう必要としないことをアロケータに伝えるだけです。brkアロケーターは、さらに割り当てるためにそれをキャッシュするか、ポインターを変更してシステムに返すことができます。それはすべて実装に依存します。

于 2013-02-28T15:38:01.487 に答える
1

システム メモリが実際に解放されるタイミングは、OS によって異なります。

たとえば Windows では、プログラムを閉じても同時にメモリは解放されません。次回のプログラム起動時に再利用するために作られています。

于 2013-02-28T15:35:37.467 に答える