2016-05-17 4 views
2

マップにスマートポインタを保持する必要があります。マップはオブジェクトを所有していませんが、他の場所のオブジェクトには複数のshared_ptrがあります。所有権のないコンテナからSmart Ptrをクリーンアップするパターン

マップを定期的にポーリングすることなく、オブジェクトに対する他のすべてのshared_ptrsが破棄されたら、キーをこのマップから削除するにはどうすればよいですか?

+2

方法について。生のポインタをマップに格納します。マップへの参照を保持するshared_ptrにカスタムディレターを使用し、カスタムディレーターが呼び出されたときにマップからキー/値を削除します。 –

+0

私はこれらの行に沿って何かを考えていました(このオブジェクトは常にスマートなptrで割り当てられるので、私はクラスデストラクタで扱うことができました)が、これを処理するための一般的なパターンがあるかどうかは疑問でした。問題はそれがまれであるようには思われません。ありがとう。 – Kindread

答えて

2

、あなたが、これはstd::shared_ptrの機能ではないことを知っているためstd::shared_ptrがすべてを処理したいという意味で「ポーリングなし」場合。確かに、shared_ptrは現在の使用回数を把握していますが、変更を更新するための信号は受信されません。

ただし、すべてではないが時々チェックを実行するソリューションを用意することもできます。

std::shared_ptrの代わりにstd::weak_ptrを保持するstd::mapを使用することをお勧めします。どのptrsが無効であるかを確認するためにチェックを実行し、それらを削除する必要があります。チェックする頻度はあなた次第です。たとえば、新しいアイテムを追加していて、マップに20,000を超えるアイテムがある場合にのみ地図を確認できます。

+0

デストラクタやカスタムディテクタを使って、それを行う方法が考えられます。私は時間間隔ではなく、サイズに基づいて地図をチェックすることを考慮しなかった、そのためにありがとう。 – Kindread

+0

このソリューションを使う場合は、std :: shared_ptrの代わりにstd :: weak_ptrを使用することが重要です。そうでなければ、頻繁ではないかもしれないマップをきれいにするときにだけメモリを解放します。 –

+1

@Kindreadデストラクタ/カスタムディテクタを使用することは、あなたがマップについて知っている限り、それを行う1つの方法です。 –

関連する問題