C言語

【C言語】第9章第14回:ガベージコレクションの基礎

ガベージコレクション(GC)は、自動的に不要なメモリを解放する仕組みです。本記事では、C言語のメモリ管理に焦点を当て、手動でメモリを管理する方法について学びます。

0. 記事の概要

この記事を読むメリット

  • メモリ管理の理解:動的メモリ割り当てと解放の重要性を学びます。
  • メモリリークの防止:効率的なメモリ管理を実現するスキルを習得します。
  • メモリ効率向上:不要なメモリの利用を防ぎ、プログラムの効率を高めます。

この記事で学べること

  • ガベージコレクションの基本概念
  • C言語での手動メモリ管理
  • メモリリークの防止方法

1. ガベージコレクションの基本概念

1.1 ガベージコレクションとは?

ガベージコレクション(GC)は、プログラム実行中に不要になったメモリを自動的に解放する仕組みです。ただし、C言語には組み込みのGC機能がないため、プログラマーが手動でメモリを管理する必要があります。

1.2 ガベージコレクションがない理由

  • C言語は、パフォーマンスを重視した設計のため。
  • ハードウェアとの密接な連携が求められる場面が多い。
  • 開発者に完全な制御権を与えるため。

1.3 手動メモリ管理の利点と欠点

  • 利点:メモリの使用を正確に制御可能。
  • 欠点:メモリリークやダングリングポインタ(無効なポインタ)を引き起こすリスク。

2. C言語での手動メモリ管理

2.1 mallocとfreeの基本

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

int main() {
    int* ptr = (int*)malloc(sizeof(int) * 5); // 動的メモリ割り当て
    if (!ptr) {
        printf("メモリ割り当てに失敗しました\\n");
        return 1;
    }

    for (int i = 0; i < 5; i++) {
        ptr[i] = i * 2; // メモリにデータを保存
    }

    for (int i = 0; i < 5; i++) {
        printf("ptr[%d] = %d\\n", i, ptr[i]);
    }

    free(ptr); // メモリを解放
    return 0;
}
動作解説
  1. メモリの確保:`malloc`で必要なメモリを確保します。
  2. データの操作:確保したメモリ領域にデータを格納します。
  3. メモリの解放:`free`で不要になったメモリを解放します。

2.2 メモリリークの防止

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

int main() {
    int* ptr = (int*)malloc(sizeof(int));
    if (!ptr) {
        printf("メモリ割り当てに失敗しました\\n");
        return 1;
    }

    // メモリ解放を忘れるとリークが発生
    free(ptr); // 必ず解放する
    return 0;
}

`free`を忘れることで、メモリが使用されたままになる問題が発生します。

3. 練習問題

以下の課題に挑戦して、手動メモリ管理の理解を深めましょう。

  1. 動的に配列を作成し、値を格納して表示した後にメモリを解放するプログラムを作成してください。
  2. `free`を忘れた場合のメモリリークを検出する方法を調査し、ツール(例:valgrind)を使用して確認してください。
  3. ダングリングポインタを避けるための安全なメモリ解放方法を実装してください。

4. 練習問題の解答と解説

問1の解答例

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

int main() {
    int n = 10;
    int* arr = (int*)malloc(sizeof(int) * n);

    if (!arr) {
        printf("メモリ割り当てに失敗しました\\n");
        return 1;
    }

    for (int i = 0; i < n; i++) {
        arr[i] = i + 1;
    }

    for (int i = 0; i < n; i++) {
        printf("arr[%d] = %d\\n", i, arr[i]);
    }

    free(arr); // メモリ解放
    return 0;
}

このプログラムでは、配列を動的に作成し、データを表示した後にメモリを解放します。

5. まとめ

本記事では、C言語のメモリ管理に焦点を当て、手動でメモリを割り当てたり解放する方法を学びました。次回はさらに高度なメモリ管理手法について学びます。