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 管理に不可欠です。
チャレンジ
簡単動的なメモリの割り当てと解放の完全なライフサイクルを示す C プログラムを書いてください。プログラムでは、次のことを行う必要があります。
- 格納する integer の数を表す
countをユーザーから Read する malloc()とsizeof()を使用して、count個の integer の配列用に memory を動的に Allocate する- memory の allocation が successful だったか Check する - failed した場合は
Memory allocation failed!を出力してプログラムを終了する - allocation が successful の場合は、
Memory allocated successfully!を出力する - ユーザーから
count個の integer の values を Read し、allocated された配列に store する - すべての values の合計を Calculate し、次の形式で出力する:
Sum: [value] - Maximum の value を find し、次の形式で出力する:
Maximum: [value] free()を使用して memory を deallocate する- クリーンアップを確認するため、
Memory freed successfully!を出力する
malloc() と free() を使用するには、<stdlib.h> ヘッダーを include することを忘れないでください。この challenge は、プログラムで memory leaks を防ぐために、malloc() と free() を組み合わせて使用することの重要性を示しています。
たとえば、input が次の場合:
4
15 8 23 12output は次のようになります:
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;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理と制御フローのすべてのレッスン
自分で練習してみよう: Cオンラインコンパイラ