2017-12-20 9 views
1

が所有するオブジェクトに生のポインタのベクトルをクリア、私は最善の方法は、任意のメモリリークなしunique_ptr Sが所有するオブジェクトを指す生のポインタのvectorvectorの秒をクリアするためには何か疑問に思って。ユニークなポインタ

私が持っていると仮定し、これをより具体的なを作るために:

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をクリアする必要がありますか?

+0

私はあなたが何を求めているか完全にはわかりません。最初に 'animalOwnerships'や' animals'のどれが破壊されるのか不明な場合は、 'shared_ptr'と共有する必要がありますか?それらが(ほぼ)同じ時間にクリアされている場合、それらをクリアする順序は関係ありません。ぶら下がっているポインタのベクトルを「クリア」するのは問題ありません。一部の人々は、まず「動物所有権」を清算するという簡潔さに感謝するかもしれない。 –

+0

@FrançoisAndrieux一般的に「動物」は永久的です。これらのベクトルを「リセット」するシナリオは1つしかなく、私がそれを行う順序を完全に制御することができます。これを考えると、 'animals.clear()'の前に 'animalOwnerships.clear()'を呼びますか?私がそれらを連続してクリアしているのなら、それは本当に重要ですか? 'animals.clear()'を最初に呼び出すと、何が起こっているのか(ポインタとメモリの点で)もっと興味があります。 – PhysicsCodingEnthusiast

+3

'animals'をクリアすると、それに含まれる' unique_ptr'をそれぞれ破壊します。これは、それぞれの指し示された 'Animal'インスタンスを' delete'します。その時点で、 'animalOwnerships'は変更されませんが、ポインタはすべて無効です(ダングリング)。あなたはそれらのポインタを破壊することができます(それらに 'delete 'を与える​​ことと混同しないでください)ので、' animalOwnerships'を 'clear'することは問題ではありません。 –

答えて

2

ポインタは、位置が記載された紙のようなものです。

ダングリングポインタは、存在しない家のアドレスです。

メモリリークは、あなたが所有している唯一のレコードが特定の紙の上にあり、それを破壊してその家を追跡できなくなった場合に発生します。

ぶら下がりポインタは、誰かがそれに従うと悪いことが起こるという点では問題があり、危険です。しかし、それは即時のバグではありません。漏れさえも即時のバグではありません。

ユニークなptrオブジェクトは、同じアドレスです。同じ書き込みですが、魔法の宝石に書かれています。宝石が破壊されると、家も破壊されます。

これは、一意のptrを漏らさずにリソースをリークするのを困難にします。リソースの所有者は明確である - それはユニークなptrです - ユニークなptrを破壊することによって誰もがリソースをクリーンアップするだけで知っているはずです(破壊する)宝石)。

人/動物のベクターを消去すると、自動的に家(人や動物)を破壊する固有のptrs(宝石)が破壊されます。

ポインタのベクトルベクトルは残っていますが、ダングリングポインタでいっぱいです。その後、それをクリアするのが良いアイデアになります。しかし、そこからの即時の害はありません。動物が構造化されたテーブルのどこにあるのかを示す単なるメモのセットであるため、前または後にそれをクリアすることは、人または動物の生涯に影響を与えません。

+0

私はおとぎ話を読んでいるような気がしましたが、魔法の宝石とは何ですか?しかし、非常に明確に述べた - ありがとう! – PhysicsCodingEnthusiast

関連する問題