私はここで非常によく似た質問をしましたが、それは非常に根本的な問題なので、私の(新しい)質問をより正確に述べたいと思います。
非常に複雑なクラスAがあり、Aの各インスタンスがベクター、キューなどの複数のコンテナーに格納されているとします。
静的な設定でも、オブジェクトは一度コンテナに追加され、削除も変更もされません。
コンテナには、オブジェクトまたはオブジェクト自体へのポインタが含まれている必要がありますか?
オブジェクトのコピーが必要な場合は、オブジェクトを使用してください。オブジェクトを共有する必要がある場合、またはポリモーフィックな動作が必要な場合は、smart pointers
. スマート ポインターを使用すると、オブジェクトの自動破棄とポリモーフィックな動作の両方が可能になります。
例えば:
std::vector<std::shared_ptr<MyObject>> v;
auto ptr = std::shared_ptr<MyObject>(new MyObject());
v.push_back(ptr);
一意のポインタを保存する必要がある場合 (共有なし):
std::vector<std::unique_ptr<MyObject>> v;
auto ptr = std::unique_ptr<MyObject>(new MyObject());
v.push_back(std::move(ptr));
の各インスタンスがA
複数のコンテナーに格納されている場合は、オブジェクト自体ではなく (スマート) ポインターを格納する必要があります。そうしないと、各コンテナーに固有のコピーが作成されます。1 つのコンテナー内のインスタンスを変更しても、他のコンテナーには影響しません。何も変更していない場合でも、完全なオブジェクトのコピーを保存しても、コンテナ全体のインスタンスが実際には同じであるという意味にはなりません。
オブジェクトが大きい場合、コピー コストが高い場合、またはコピーが複雑な場合は、スマート ポインターを格納します。