web-dev-qa-db-ja.com

Cでメモリを解放するにはどうすればよいですか?

1次元と2次元の配列がたくさんあるコードを書いています。 「エラー:領域を割り当てることができません」と表示されましたが、割り当てられているメモリが多すぎるためだと思います。私は「malloc」および「free」関数を使用しますが、それらを正しく使用しているかどうかはわかりません。たぶん、Cでのメモリ管理の良い例を見ることができる場所を知っていますか?

だから..私は1つのアルゴリズムを機能させようとしていますが、今のところこのコードは機能ごとに機能しています..

//memory allocation for 1D arrays
buffer = malloc(num_items*sizeof(double));

//memory allocation for 2D arrays
double **cross_norm=(double**)malloc(150 * sizeof(double *));
for(i=0; i<150;i++)
    {
        cross_norm[i]=(double*)malloc(num_items*sizeof(double));
    }

    //code
Window(N, window_buffer);
STFTforBMP(buffer,N,f, window_buffer);
getMagnitude(buffer,f, N, magnitude);
calculateEnergy(flux,magnitude, f);
calculateExpectedEnergy(expected_flux, candidate_beat_period, downbeat_location, f);
calculateCrossCorrelation(cross, flux, expected_values, f);
findLargestCrossCorrelation(&cross_max, cross, f);
normalizeCrossCorrelation(cross_norm, &cross_max, cross, f);
    ...............

free関数を使用するにはどうすればよいですか?

32
andrey

free()を使用して割り当てられたメモリとはまったく逆の順序で、malloc()を割り当てる必要があります。

割り当てられたポインタの使用が完了した後にのみ、メモリを解放する必要があることに注意してください。

1D配列のメモリ割り当て:

    buffer = malloc(num_items*sizeof(double));

1D配列のメモリ割り当て解除:

    free(buffer);

2D配列のメモリ割り当て:

    double **cross_norm=(double**)malloc(150 * sizeof(double *));
    for(i=0; i<150;i++)
    {
        cross_norm[i]=(double*)malloc(num_items*sizeof(double));
    }

2D配列のメモリ割り当て解除:

    for(i=0; i<150;i++)
    {
        free(cross_norm[i]);
    }

    free(cross_norm);
42
Alok Save

メモリがプロセスからOSに解放されるという意味で、実際にCでメモリを手動で「解放」することはできません... malloc()を呼び出すと、基盤となるlibc-runtimeが要求しますOSはメモリ領域です。 Linuxでは、これはmmap()のような比較的「重い」呼び出しで行われます。このメモリ領域がプログラムにマッピングされると、この割り当てられたメモリ領域を管理する「フリーストア」と呼ばれるリンクリストのセットアップがあります。 malloc()を呼び出すと、要求されたサイズでメモリの空きブロックを探して空きストアをすばやく検索します。次に、最初に割り当てられたメモリプールからメモリのチャンクが取り出されたことを反映するように、リンクリストを調整します。 free()を呼び出すと、メモリブロックは、使用可能なメモリチャンクを示すリンクリストノードとしてフリーストアに戻されます。

Free-storeにあるメモリよりも多くのメモリを要求すると、libc-runtimeは、実行中のプロセスにメモリを割り当てるOSの能力の限界まで、OSに再びメモリを要求します。ただし、メモリを解放しても、OSに返されることはありません...通常は、malloc()の別の呼び出しで再び使用できる空きストアにリサイクルされます。したがって、さまざまなメモリサイズのリクエストでmalloc()およびfree()を何度も呼び出すと、理論的には、「メモリフラグメンテーション」と呼ばれる状態を引き起こす可能性があります。要求されたメモリブロックを割り当てるための空きストア内のスペース。ただし、十分ではありません連続要求したブロックサイズのスペース。したがって、malloc()の呼び出しは失敗し、空きストアの合計バイト数として十分なメモリが利用できる場合でも、事実上「メモリ不足」になります。

28
Jason