C++ で配列を動的に割り当てる方法

胡金庫 2023年10月12日
  1. C++ で new() 演算子を使用して配列を動的に割り当てる
  2. C++ で配列を動的に割り当てるには std::unique_ptr メソッドを利用する
  3. C++ で配列を動的に割り当てるには std::make_unique() メソッドを使用する
C++ で配列を動的に割り当てる方法

この記事では、C++ で配列を動的に割り当てる方法について複数のメソッドを示します。

C++ で new() 演算子を使用して配列を動的に割り当てる

new 演算子は heap メモリ上のオブジェクトを動的に確保し、その位置へのポインタを返します。この例では、定数文字の配列とサイズを int 変数として宣言します。そして、char 配列を動的に確保し、for ループボディ内の要素に対応する値を代入します。

削除演算子 delete は、arr ポインタに関連付けられたメモリが不要になったら明示的に呼び出さなければならないことに注意してください。delete 演算子の後に指定された括弧は、ポインタが配列の最初の要素を参照していることをコンパイラに伝えます。配列へのポインタを削除する際に括弧を省略した場合の動作は未定義です。

#include <iostream>

using std::cout;
using std::endl;

constexpr int SIZE = 10;
static const char chars[] = {'B', 'a', 'd', 'C', 'T', 'L', 'A', 'R', 'e', 'I'};

int main() {
  char *arr = new char[SIZE];

  for (int i = 0; i < SIZE; ++i) {
    arr[i] = chars[i];
    cout << arr[i] << "; ";
  }
  cout << endl;

  delete[] arr;
  return EXIT_SUCCESS;
}

出力:

B; a; d; C; T; L; A; R; e; I;

C++ で配列を動的に割り当てるには std::unique_ptr メソッドを利用する

動的配列を確保するもう一つの方法は、std::unique_ptr スマートポインタを利用することです。関数 unique_ptr はポインタが指すオブジェクトを所有していると言われています。通常のポインタとは異なり、スマートポインタは delete 演算子をプログラマが呼び出す必要がなく、代わりにオブジェクトが破棄されたときに暗黙的に呼び出されます。

#include <iostream>
#include <memory>

using std::cout;
using std::endl;

constexpr int SIZE = 10;
static const char chars[] = {'B', 'a', 'd', 'C', 'T', 'L', 'A', 'R', 'e', 'I'};

int main() {
  std::unique_ptr<char[]> arr(new char[SIZE]);

  for (int i = 0; i < SIZE; ++i) {
    arr[i] = chars[i];
    cout << arr[i] << "; ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

出力:

B; a; d; C; T; L; A; R; e; I;

C++ で配列を動的に割り当てるには std::make_unique() メソッドを使用する

関数 make_unique は動的なメモリ管理を扱うためのより現代的な代替手段です。このメソッドは指定された型のオブジェクトを動的に確保し、スマートポインタ std::unique_ptr を返します。オブジェクトの型はテンプレートパラメータと同様に指定されます。一方、以下の例では、固定サイズの配列 char を確保して auto 型変数に代入しています。

#include <iostream>
#include <memory>

using std::cout;
using std::endl;

constexpr int SIZE = 10;
static const char chars[] = {'B', 'a', 'd', 'C', 'T', 'L', 'A', 'R', 'e', 'I'};

int main() {
  auto arr = std::make_unique<char[]>(SIZE);

  for (int i = 0; i < SIZE; ++i) {
    arr[i] = chars[i];
    cout << arr[i] << "; ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

出力:

B; a; d; C; T; L; A; R; e; I;
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Array