Menu
Coddy logo textTech

free() によるメモリの解放

CoddyのCジャーニー「論理と制御フロー」セクションの一部。レッスン 35/63。

malloc() を使用して動的に memory を allocate すると、その memory は明示的に解放するまで allocated のままです。free() 関数は、動的に allocated された memory の using が完了したとき、それをシステムに返すためのツールです。

free()関数は、解放したいメモリブロックへのポインターという1つの引数を受け取ります。これは、malloc()(またはcalloc()などの関連する関数)が返したものと同じポインターでなければなりません。

#include <stdlib.h>

int *ptr = (int*)malloc(sizeof(int));  // メモリを割り当てる
*ptr = 42;  // メモリを使用する
free(ptr);  // 完了したらメモリを解放する

free() を呼び出さないと、いわゆるmemoryリークが発生します。allocated memory は、もう using していないにもかかわらず、プログラムによって予約されたままになります。長時間実行されるプログラムや、繰り返しメモリを確保するプログラムでは、こうしたリークによって使用可能なシステム memory がすべて消費され、パフォーマンスの問題やクラッシュが発生する可能性があります。

覚えておいてください:すべての malloc() には、対応する free() が必要です。この対応関係は、Cプログラミングにおける責任ある memory 管理に不可欠です。

challenge icon

チャレンジ

簡単

動的なメモリの割り当てと解放の完全なライフサイクルを示す C プログラムを書いてください。プログラムでは、次のことを行う必要があります。

  1. 格納する integer の数を表す count をユーザーから Read する
  2. malloc()sizeof() を使用して、count 個の integer の配列用に memory を動的に Allocate する
  3. memory の allocation が successful だったか Check する - failed した場合は Memory allocation failed! を出力してプログラムを終了する
  4. allocation が successful の場合は、Memory allocated successfully! を出力する
  5. ユーザーから count 個の integer の values を Read し、allocated された配列に store する
  6. すべての values の合計を Calculate し、次の形式で出力する:Sum: [value]
  7. Maximum の value を find し、次の形式で出力する:Maximum: [value]
  8. free() を使用して memory を deallocate する
  9. クリーンアップを確認するため、Memory freed successfully! を出力する

malloc()free() を使用するには、<stdlib.h> ヘッダーを include することを忘れないでください。この challenge は、プログラムで memory leaks を防ぐために、malloc()free() を組み合わせて使用することの重要性を示しています。

たとえば、input が次の場合:

4
15 8 23 12

output は次のようになります:

Memory allocated successfully!
Sum: 58
Maximum: 23
Memory freed successfully!

この challenge は、動的に allocated されたすべての memory block が不要になったときに適切に freed されなければならないという重要な concept を強化し、C programming における責任ある memory management cycle を完成させます。

自分で試してみよう

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

int main() {
    int count;
    
    // 格納する整数の数を読み取る
    scanf("%d", &count);
    
    // TODO: 以下にコードを書いてください
    // 1. malloc() と sizeof() を使用してメモリを割り当てる
    // 2. 割り当てが成功したか確認する
    // 3. 整数値を読み取って格納する
    // 4. 合計を計算し、最大値を見つける
    // 5. 割り当てられたメモリを解放する
    
    return 0;
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

論理と制御フローのすべてのレッスン

自分で練習してみよう: Cオンラインコンパイラ