2012-01-30 55 views
23

2次元配列の1 &がたくさんあるコードを書いています。私は "エラー:領域を割り当てることができません"と思っていますが、あまりにも多くのメモリが割り当てられていると思います。私は "malloc"と "free"関数を使用しますが、私はそれらを確実に使用しているかどうかはわかりません。 Cのメモリ管理に関する良い例がどこからわかるのか分かりますか?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機能を使用する必要がありますどのように

+6

おそらくあなたがしようとしたものを私たちに示すために、より建設的だろうか? – cnicutar

+2

あなたのコードを表示します。 – Pheonix

+0

あなたがしていることの例を挙げてください。さもなければあなたの質問はあまりにも一般的すぎて答えられません。スペックを読んでください。 – akira

答えて

32

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

割り当てられたポインタの使用が完了した後でなければ、メモリを解放しないでください。1Dアレイの

メモリ割り当て:1Dアレイの

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

メモリ割り当て解除:2Dアレイの

free(buffer); 

メモリ割り当て:

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

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

フリーストアにあるものよりも多くのメモリを要求すると、libc-runtimeは、実行中のプロセスにメモリを割り当てるためのOSの能力の上限まで、OSからさらに多くのメモリを要求します。あなたがメモリを解放すると、OSに戻されることはありません。通常、フリーストアにリサイクルされ、malloc()の別の呼び出しで再び使用できます。したがって、さまざまなメモリサイズ要求でmalloc()free()に多くの呼び出しを行うと、理論上は、メモリの断片化という条件が発生する可能性があります。この場合、フリーストアに、要求されたメモリブロック、あなたが要求したブロックのサイズのための十分な連続したスペース。したがって、malloc()への呼び出しは失敗し、フリーストアの総バイト数として利用可能なメモリが十分にある場合でも、実質的に「メモリ不足」になります。

+2

OPだけが私のものか、OPが何か違うことを求めているのですか?答えは(うまくいっても)何か他のことを説明していますか? –

+3

私は自分の答えを入力していたので、OPは彼の質問を更新しました(私はいくつかのコメントに応じて推測しています)...私は私の答えが更新された質問に明示的に答えていなくても、彼の元々の質問にはコードはなく、基本的に彼は 'malloc'と' free'を使っていましたが、 "can not allocate region"というエラーで終了しました。メモリの断片化の可能性が私には聞こえたので、これは良い答えかもしれないと思った。 – Jason

+0

ああ、私は参照してください。はい。変更された質問は、それがplace.Anywaysあなたが努力のために私の+1を持っている気分になりますが、素晴らしい説明です。 –

関連する問題