unique_ptr
配列に入れるのは良い習慣だと思いますか?はい、私は知っています、彼らは珍しいコピーセマンティクスを持っています、しかし私の考えはこれです:
タイルベースのゲームフィールドがあります。配列内の各ポインターは、ゲームオブジェクトを指します。配列要素に新しいものを割り当てると、前のオブジェクトが破棄され、新しいオブジェクトが配置されます。
別の質問-shared_ptrについても同じです。フライウェイトパターンを使用することがあるからです。
unique_ptr
の最大の利点の1 つは、のような標準コンテナーで安全に使用できることstd::vector
です。std::vector<std::unique_ptr<T>>
アンチパターンではありません。完全に問題なく、強くお勧めします。
一般に、これは良い習慣です。その場合、マトリックスはオブジェクトの所有者になり (ほとんどの場合はうまく機能するはずです)、オブジェクトの他のコンシューマーは、オブジェクトへの生のポインターを保持するだけです。
これは安全で効率的です。
一方、ポインタが必要かどうかを検討してください。私の理解が正しければ、ここでポインターを使用する唯一の理由は、ポリモーフィック オブジェクトを格納できるようにするためです。boost::variant
ここで代替手段になるか、または何らかの種類value_ptr
(残念ながら標準ライブラリには含まれていませんが、実装は簡単です)かどうかを検討してください。
unique_ptr
;のコピー セマンティクスに異常はありません。移動はできますがコピーはできないため、標準のコンテナでの使用に完全に適しています。
auto_ptr
移動セマンティクスが言語に追加される前に、破壊的なコピー セマンティクスを使用してそれらをエミュレートしようとした非推奨のことを考えているかもしれません。これにより、標準のコンテナーで安全に使用することが非常に困難になりました。
コンテナーにポインターまたはオブジェクトを格納する必要があるかどうかは、別の問題です。一般に、オブジェクトを格納する方が適切です。それらが非常に大きいか、そうでなければ移動するのに費用がかかる場合を除き、または異なるタイプのオブジェクト (共通の基本クラスへのポインター) を格納する必要がない限り。
ポインタを保存し、コンテナでオブジェクトの有効期間を管理する場合unique_ptr
は、これが最適な選択です。他のエンティティと所有権を共有したい場合、またはオブジェクトが配列から削除されたかどうかを判断するためshared_ptr
に使用したい場合にも適しています。weak_ptr
一般に、unique_ptr は参照カウントを行わないため、shared_ptr よりもパフォーマンスが高くなりますが、1 つの場所に所有権が必要です。次の場合、これは危険です。
vector<unique_ptr<GameObject>> v;
次のように参照します。
GameObject* p = v[42].get();
42 番目の位置が削除または置換されると、p はハンギング ポインターになります。
でも:
vector<shared_ptr<GameObject>> v;
shared_ptr<GameObject> p = v[42];
v[42] が削除されても、基になるオブジェクトは p の間保持されますが、参照カウントの更新のオーバーヘッドがあります。
私の提案は、パフォーマンスが問題にならない限り、より安全であるため、shared_ptr を優先することです。