C++は便利なもので、new演算を使用すれば、配列を動的に割り付けることが簡単にできます。ただし、どうしても細かいメモリ管理を自分で行わないといけない状況でなければ、スマートポインタを使うのが普通です。
C++03までであればstd::auto_ptrがありますが、これは配列型には使えませんので、いったん構造体で配列をラップしてから使うことになります。
0 1 2 3 4 5 6 7 8 |
// 配列をラップする構造体 struct array { int data[10]; }; std::auto_ptr<array> ap(new array); |
なお、std::auto_ptrはC++で非推奨に、C++17からは廃止になってしまいましたので、新しいバージョンのC++に移植する可能性があるなら避けた方がよいかもしれません。
C++11以降は、std::auto_ptrの代替となるstd::unique_ptrが導入されました。また、参照カウンタを使って管理するstd::shared_ptrも使うことができます。これらのスマートポインタでは配列型を使うこともできますので、より使い勝手がよくなっています。
0 1 2 3 |
std::unique_ptr<int[]> up(new int[5]{ 0, 1, 2, 3, 4 }); std::shared_ptr<int[]> sp(new int[5]{ 0, 1, 2, 3, 4 }); |
上記のように、C++11以降ではnew式で配列の初期値も指定できますので、ちょっとタイミング量が多いことを除けば普通の配列を変わらない使い勝手が得られます。
ところで、割り付けた配列のサイズがずっと変わらないのであればよいのですが、途中でサイズを大きくしたり小さくしたりしたくなることもあります。C言語でいえばrealloc関数を使いますような状況です。そういうときは、std::vectorクラステンプレートを使用することで、ほとんどの要求を満たすことができるはずです。
0 1 2 3 4 |
std::vector<int> v(10); // 10要素を持たせる。 v.resize(20); // 20要素に拡張する。 v.resize(5); // 5要素に縮小する。 |
このように、C++には便利なライブラリがありますので、配列を動的に確保するために何かを自作する必要はほぼなさそうです。