と を使用しCreature
て、アプリケーションの一部で作成および所有されるオブジェクトのコレクションがあります。std::make_shared
std::shared_ptr
また、を使用して、オブジェクトCreature
内の 0 または 1 の選択を追跡します。World
std::weak_ptr<Creature>
void World::SetSelection(const std::shared_ptr<Creature>& creature) {
selection = creature;
}
std::shared_ptr<Creature> World::GetSelection() const {
return selection.lock();
}
の呼び出し元はGetSelection
、ポインターが空かどうかをチェックする責任があります。そうである場合、それは現在選択がないことを意味します。
これはすべて私の好みで完全に機能します。選択したものCreature
が自然な原因で (アプリケーションの他の場所で) 死ぬと、何も選択されなかったかのように再びGetSelection
a を返し始めます。nullptr
ただし、その場合、メンバーはまだの制御ブロックWorld::selection
を指しています。オブジェクトを作成するstd::shared_ptr
ために使用しているため、これは非常に大きくなる可能性があります (オブジェクトは適切なタイミングで適切に破棄されましたが、そのためのメモリはまだ割り当てられていることに気付きました)。これに変更することを検討しています:std::make_shared
Creature
Creature
GetSelection
std::shared_ptr<Creature> World::GetSelection() {
const auto ret = selection.lock();
if (!ret)
selection.reset();
return ret;
}
これにより、不要になったことに気付くとすぐにメモリが解放されます。厄介なことに、このバージョンのGetSelection
はconst
.
私の質問:
GetSelection
この状況でベスト プラクティスと見なされるのは、どのバージョンのですか?テンプレート化されたコードで同様のことが起こった場合、答えは変わります
sizeof(T)
か? または、C++ 14 ではどこstd::make_shared<T[]>
に関与する可能性がありますか?std::weak_ptr<T>::expired
2 番目のバージョンが常に最適である場合、自分でそれを行わない理由は何lock
ですか?