が所有するオブジェクトに生のポインタのベクトルをクリア、私は最善の方法は、任意のメモリリークなしunique_ptr
Sが所有するオブジェクトを指す生のポインタのvector
vector
の秒をクリアするためには何か疑問に思って。ユニークなポインタ
私が持っていると仮定し、これをより具体的なを作るために:
std::vector<std::unique_ptr<Person>> people;
std::vector<std::unique_ptr<Animal>> animals;
std::vector<std::vector<Animal*>> animalOwnerships;
私は順番にクラスのオブジェクトを削除しますた、クラスオブジェクトに独自のポインタを削除しますこれは、people.clear()
とanimals.clear()
を使用することができます知っています自分自身(私がここで間違っている場合は私を修正してください)。
私がこれらを最初に呼び出すと、animalOwnerships
はポインタがぶら下がっていますか?この時点でanimalOwnerships.clear()
に電話をかけることは大丈夫ですか?メモリリークについて心配する必要はありませんか、それとも先に呼び出されるべきですか?
またanimalOwnerships
の個別にvectors
をクリアする必要がありますか?
私はあなたが何を求めているか完全にはわかりません。最初に 'animalOwnerships'や' animals'のどれが破壊されるのか不明な場合は、 'shared_ptr'と共有する必要がありますか?それらが(ほぼ)同じ時間にクリアされている場合、それらをクリアする順序は関係ありません。ぶら下がっているポインタのベクトルを「クリア」するのは問題ありません。一部の人々は、まず「動物所有権」を清算するという簡潔さに感謝するかもしれない。 –
@FrançoisAndrieux一般的に「動物」は永久的です。これらのベクトルを「リセット」するシナリオは1つしかなく、私がそれを行う順序を完全に制御することができます。これを考えると、 'animals.clear()'の前に 'animalOwnerships.clear()'を呼びますか?私がそれらを連続してクリアしているのなら、それは本当に重要ですか? 'animals.clear()'を最初に呼び出すと、何が起こっているのか(ポインタとメモリの点で)もっと興味があります。 – PhysicsCodingEnthusiast
'animals'をクリアすると、それに含まれる' unique_ptr'をそれぞれ破壊します。これは、それぞれの指し示された 'Animal'インスタンスを' delete'します。その時点で、 'animalOwnerships'は変更されませんが、ポインタはすべて無効です(ダングリング)。あなたはそれらのポインタを破壊することができます(それらに 'delete 'を与えることと混同しないでください)ので、' animalOwnerships'を 'clear'することは問題ではありません。 –