C言語の動的メモリ確保。malloc, free, メモリリークの原因と対策。
int a[5]; のようにサイズをコンパイル時に固定していました。でも実際のプログラムでは、「データが何件あるか実行してみないと分からない」場面が多くあります。malloc は指定バイト数のメモリを確保し、先頭アドレス(ポインタ)を返します。使い終わったら free で解放します。malloc はバイト単位で確保するため、sizeof を使って型のサイズを掛けるのがセオリーです。
[] でアクセスできます。malloc で確保したメモリを free し忘れると、プログラムが終了するまでそのメモリが解放されず占有されたままになります。これをメモリリークと呼びます。A. サイズが決まっているなら配列を使い、実行時に決まるならmallocを使います。例えば「最大100個」が決定済みなら配列、「ユーザーが個数を入力」するならmallocです。一般的に配列の方が高速で安全なので、できるだけ配列を優先しましょう。
A. freeし忘れるとメモリリークが発生します。確保したメモリが使用不可になるため、長く実行するプログラムではメモリがどんどん減少し、最終的に「メモリ不足」でクラッシュします。mallocしたら「必ずfree」が原則です。確保と解放は対になっていないといけません。
A. mallocは指定サイズのメモリを確保しますが、中身は不定です。callocは確保したメモリを自動的に0で初期化します。callocの形式は `calloc(個数, サイズ)` で、例えば `calloc(10, sizeof(int))` は10個のint型を0で初期化して確保します。
A. メモリリークは「確保したメモリをfreeしないで、プログラム終了時に無駄になる」状態です。1回や2回なら問題ないですが、ループ内でmallocを繰り返すと累積し、メモリが枯渇します。デバッグには valgrind --leak-check=full などのツールを使って、リークを検出します。
この講座の理解度をチェックしましょう!
malloc で確保したメモリは free で明示的に解放しないとメモリリーク(メモリの無駄遣い)になります。
sizeof(int) × 10 で int 型10個分のサイズを計算し、そのバイト数のメモリをヒープ上に確保します。
free 後のポインタは無効なアドレスを指す「ダングリングポインタ」になります。NULL を代入して安全にするのが良い習慣です。