16:メモリの動的確保

はじめに

この章では、C++における「動的なメモリ確保と解放」について学びます。プログラムの実行中に必要なだけメモリを確保したり、不要になったら解放することで、柔軟なメモリ管理が可能になります。


静的メモリ確保 と 動的メモリ確保

種類 宣言例 確保のタイミング 解放方法
静的確保 int a; コンパイル時 自動
動的確保 int* p = new int; 実行時(プログラム中) delete p;

単一の変数を動的に確保(15_new_delete_basic.cpp)

#include <iostream>
using namespace std;

int main() {
    int* p = new int;  // int型のメモリを1つ確保
    *p = 100;          // 値を代入
    cout << *p << endl; // 値を表示
    delete p;          // メモリを解放
    return 0;
}

配列を動的に確保(15_new_delete_array.cpp)

#include <iostream>
using namespace std;

int main() {
    int size;
    cout << "配列のサイズを入力: ";
    cin >> size;

    int* arr = new int[size];
    for (int i = 0; i < size; i++) arr[i] = i * 10;

    for (int i = 0; i < size; i++) cout << arr[i] << " ";
    cout << endl;

    delete[] arr;  // 配列は delete[] で解放
    return 0;
}

ベクタとの違いは?

項目 new / delete vector
サイズの可変性 自分で確保し直す必要あり .push_back()で簡単に拡張可能
解放 明示的に delete 必要 自動で解放される
安全性 ミスするとメモリリーク 安全で例外処理も対応
推奨度 低(必要なときのみ) 高(基本的にこちらを使う)

✅ 通常は vector を使えば十分。new は特別な場合にだけ使う。


理解度チェック

問題1(15_pointer_array.cpp)

次のコードの出力は何ですか?

int* p = new int[3];
p[0] = 10; p[1] = 20; p[2] = 30;
cout << p[1];
delete[] p;
正解・解説を見る 20 が表示される。newで確保された配列は通常の配列と同じように扱える。

演習問題(15_input_dynamic_array_newdelete.cpp)

解答例を見る
#include <iostream>
using namespace std;

int main() {
    int n;
    cout << "人数を入力: ";
    cin >> n;

    int* scores = new int[n];
    int total = 0;

    for (int i = 0; i < n; i++) {
        cout << i + 1 << "人目の点数: ";
        cin >> scores[i];
        total += scores[i];
    }

    cout << "合計: " << total << endl;
    cout << "平均: " << (double)total / n << endl;

    delete[] scores;
    return 0;
}

演習問題(15_input_dynamic_array_vector.cpp)


まとめ