マップにスマートポインタを保持する必要があります。マップはオブジェクトを所有していませんが、他の場所のオブジェクトには複数のshared_ptrがあります。所有権のないコンテナからSmart Ptrをクリーンアップするパターン
マップを定期的にポーリングすることなく、オブジェクトに対する他のすべてのshared_ptrsが破棄されたら、キーをこのマップから削除するにはどうすればよいですか?
マップにスマートポインタを保持する必要があります。マップはオブジェクトを所有していませんが、他の場所のオブジェクトには複数のshared_ptrがあります。所有権のないコンテナからSmart Ptrをクリーンアップするパターン
マップを定期的にポーリングすることなく、オブジェクトに対する他のすべてのshared_ptrsが破棄されたら、キーをこのマップから削除するにはどうすればよいですか?
、あなたが、これはstd::shared_ptr
の機能ではないことを知っているためstd::shared_ptr
がすべてを処理したいという意味で「ポーリングなし」場合。確かに、shared_ptr
は現在の使用回数を把握していますが、変更を更新するための信号は受信されません。
ただし、すべてではないが時々チェックを実行するソリューションを用意することもできます。
std::shared_ptr
の代わりにstd::weak_ptrを保持するstd::map
を使用することをお勧めします。どのptrsが無効であるかを確認するためにチェックを実行し、それらを削除する必要があります。チェックする頻度はあなた次第です。たとえば、新しいアイテムを追加していて、マップに20,000を超えるアイテムがある場合にのみ地図を確認できます。
デストラクタやカスタムディテクタを使って、それを行う方法が考えられます。私は時間間隔ではなく、サイズに基づいて地図をチェックすることを考慮しなかった、そのためにありがとう。 – Kindread
このソリューションを使う場合は、std :: shared_ptrの代わりにstd :: weak_ptrを使用することが重要です。そうでなければ、頻繁ではないかもしれないマップをきれいにするときにだけメモリを解放します。 –
@Kindreadデストラクタ/カスタムディテクタを使用することは、あなたがマップについて知っている限り、それを行う1つの方法です。 –
shared_ptr
には、オブジェクトの削除に役立つdeleter
を付けることができます。このdeleter
の中には、それに応じてmap
を更新することができます。例えば
は参照してください:http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr
方法について。生のポインタをマップに格納します。マップへの参照を保持するshared_ptrにカスタムディレターを使用し、カスタムディレーターが呼び出されたときにマップからキー/値を削除します。 –
私はこれらの行に沿って何かを考えていました(このオブジェクトは常にスマートなptrで割り当てられるので、私はクラスデストラクタで扱うことができました)が、これを処理するための一般的なパターンがあるかどうかは疑問でした。問題はそれがまれであるようには思われません。ありがとう。 – Kindread