【C++】new[]とdelete[]で動的配列を確保・解放する方法

目次

はじめに

C++で配列を宣言する際、int data[10]; のように、そのサイズは通常、プログラムを書く時点(コンパイル時)で決まっている必要があります。しかし、プログラムを実行し、ユーザーからの入力を受け取るまで、配列の大きさが分からないという場面は非常に多くあります。

このような、プログラムの実行時にサイズが決まる配列を「動的配列」と呼びます。C++では、new[] 演算子を使うことで、動的に配列のためのメモリを確保できます。

この記事では、new[]で動的に配列を確保し、使い終わった後に delete[] で安全にメモリを解放するという、一連の基本的な流れを解説します。


動的配列の確保と解放のサンプルコード

このコードは、ユーザーにまずデータ数を入力してもらい、その数に応じた大きさのint型配列を動的に確保します。その後、各要素に値を入力させ、最後に内容を表示してから、確保したメモリを解放します。

完成コード

#include <iostream>

using namespace std;

int main() {
    int dataCount;
    int* pDataArray; // 動的に確保した配列を指すためのポインタ

    // 1. 配列のサイズをユーザーから受け取る
    cout << "何個のデータを入力しますか?: ";
    cin >> dataCount;

    // 2. new[] 演算子で、指定されたサイズの配列を動的に確保
    pDataArray = new int[dataCount];

    cout << dataCount << "個の整数を入力してください。" << endl;

    // 3. 確保した配列に値を入力
    for (int i = 0; i < dataCount; i++) {
        cout << i + 1 << "個目: ";
        cin >> pDataArray[i];
    }

    // 4. 配列の内容を表示
    cout << "\n--- 入力されたデータ一覧 ---" << endl;
    for (int i = 0; i < dataCount; i++) {
        cout << i + 1 << "番目のデータは " << pDataArray[i] << " です。" << endl;
    }

    // 5. delete[] 演算子で、確保した配列のメモリを解放
    delete[] pDataArray;
    
    cout << "\nメモリを解放しました。" << endl;

    return 0;
}

コードの解説

pDataArray = new int[dataCount];

これが、動的配列を確保する核心部分です。

  • new int[dataCount]: new 演算子が、intdataCount 個分の連続したメモリ領域をヒープに確保します。
  • 戻り値: 確保に成功すると、そのメモリ領域の先頭アドレスを返します。
  • pDataArray = ...: 確保した配列の先頭アドレスを、int* 型のポインタ pDataArray に代入しています。これ以降、pDataArray は通常の配列と同じように pDataArray[i] の形式で各要素にアクセスできます。

delete[] pDataArray;

これが、動的に確保した配列を解放するための重要な命令です。

  • delete[]: new[] で確保した配列全体のメモリをシステムに返却します。
  • [] を忘れないこと: もし delete pDataArray; のように [] を付け忘れると、配列の先頭要素1つ分のメモリしか解放されない可能性があり、残りの要素が解放されない「メモリリーク」を引き起こします。

newdeletenew[]delete[] は、必ずペアで使う、というルールを徹底しましょう。


まとめ

今回は、C++の new[]delete[] を使った、動的配列の確保と解放の基本について解説しました。

  • new データ型[要素数] で、実行時にサイズが決まる配列を確保する。
  • 確保したメモリは、ポインタを通じて通常の配列のようにアクセスできる。
  • 使い終わったら、必ず delete[] ポインタ名 で配列全体のメモリを解放する。

このテクニックは、ファイルから読み込むデータの件数が不明な場合など、プログラムの柔軟性を高める上で非常に重要です。ただし、C++では、このような手動でのメモリ管理はメモリリークなどのバグを生みやすいため、より現代的な std::vector を使うのが一般的で、より安全です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次