はじめに
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
演算子が、int
型dataCount
個分の連続したメモリ領域をヒープに確保します。- 戻り値: 確保に成功すると、そのメモリ領域の先頭アドレスを返します。
pDataArray = ...
: 確保した配列の先頭アドレスを、int*
型のポインタpDataArray
に代入しています。これ以降、pDataArray
は通常の配列と同じようにpDataArray[i]
の形式で各要素にアクセスできます。
delete[] pDataArray;
これが、動的に確保した配列を解放するための重要な命令です。
delete[]
:new[]
で確保した配列全体のメモリをシステムに返却します。[]
を忘れないこと: もしdelete pDataArray;
のように[]
を付け忘れると、配列の先頭要素1つ分のメモリしか解放されない可能性があり、残りの要素が解放されない「メモリリーク」を引き起こします。
new
と delete
、new[]
と delete[]
は、必ずペアで使う、というルールを徹底しましょう。
まとめ
今回は、C++の new[]
と delete[]
を使った、動的配列の確保と解放の基本について解説しました。
new データ型[要素数]
で、実行時にサイズが決まる配列を確保する。- 確保したメモリは、ポインタを通じて通常の配列のようにアクセスできる。
- 使い終わったら、必ず
delete[] ポインタ名
で配列全体のメモリを解放する。
このテクニックは、ファイルから読み込むデータの件数が不明な場合など、プログラムの柔軟性を高める上で非常に重要です。ただし、C++では、このような手動でのメモリ管理はメモリリークなどのバグを生みやすいため、より現代的な std::vector
を使うのが一般的で、より安全です。