1. ホーム
  2. c

[解決済み] C言語でメモリを解放するにはどうしたらいいですか?

2022-03-04 16:11:59

質問

1次元と2次元の配列がたくさんあるコードを書いています。error: can't allocate region"と表示され、メモリが多すぎるためだと思います。私は "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 関数を使用してください。

どのように解決するのですか?

以下のことが必要です。 free() を使用して割り当てたのと全く逆の順序で、割り当てられたメモリを削除します。 malloc() .

注意:メモリを解放するのは、割り当てられたポインタの利用が終了してからにしてください。

1次元配列のメモリ割り当て

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

1次元配列のメモリ解放。

    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);