std::unique_ptr
は、例えば、配列をサポートしています。
std::unique_ptr<int[]> p(new int[10]);
しかし、これは必要なのでしょうか? おそらく、std::vector
や std::array
を使う方が便利でしょう。
この構造の使い道はありますか?
アロケータがあっても std::vector
を使う余裕がない人もいるでしょう。動的なサイズの配列を必要とする人もいるので、std::array
は使えません。また、配列を返すことが知られている他のコードから配列を取得する人もいて、そのコードが vector
などを返すように書き換えられることはありません。
unique_ptr<T[]>`を許可することで、そのようなニーズに応えることができます。
要するに、unique_ptr<T[]>
を使うのは、*必要なときだけです。他の方法ではどうにもならない場合です。これは最後の手段です。
std::vectorはコピーしまくることができますし、
unique_ptr<int[]>は配列のユニークな所有権を表現することができます。一方、
std::array`では、コンパイル時にサイズを決定する必要があり、状況によっては不可能な場合もあります。
unique_ptr<char[]>`を使って、ゲームエンジンで使われる事前割り当てメモリプールを実装しました。アイデアとしては、ダイナミックアロケートの代わりに、事前に割り当てられたメモリプールを提供することで、コリジョンリクエストの結果や、パーティクルフィジックスのような他のものを、フレームごとにメモリを割り当てたり解放したりすることなく返すことができます。この種のシナリオでは、破壊ロジック(メモリの解放のみ)を必要としない、限られたライフタイム(通常は1、2、3フレーム)のオブジェクトを割り当てるためにメモリプールが必要になるので、非常に便利です。