ブースト:: shared_ptrの循環参照を検索します
-
18-09-2019 - |
質問
のshared_ptrのの循環参照を見つけるための任意のヒント/トリックはありますか?
これは私が見つけるためにしようとしているもののexmapleある - 。残念ながら、私は自分のコード内のループを見つけることができないよう、
struct A
{
boost::shared_ptr<C> anC;
};
struct B
{
boost::shared_ptr<A> anA;
};
struct C
{
boost::shared_ptr<B> anB;
};
解決 4
私は上記の投稿の組み合わせを使用していました。私はいくつかの疑いのサイクルで上がってきたのweak_ptr年代を使って、それらを破った、メモリプロファイラを使用します。
私は前CRTのメモリリークの検出に建て使用しましたが、残念ながら私の場合、私はCRT検出器のライフサイクルの後であると考えているモジュールのアンロードされるまで割り当て解除を取得いけない、いくつかの静的シングルトンがあります。基本的には偽陽性ですスピューの多くを与えます。
他のヒント
私は Valgrindのを使用してお勧めします。あなたがプロセスをシャットダウンすると、それはあなたのすべてのメモリリークが表示されます。あなたのシャットダウンが何とかサイクルを壊していない限り、すべてのサイクルがリークしたメモリとして表示されるはずですし、あなたのコード内でメモリが元々から割り当てられた場所Valgrindのは、あなたを教えてくれます。
私は一度信用リスクシステムの設計を担当しました。これらのことは、ノードに割り当てられたリスクと本当に大きなグラフです。私たちは、サイクルにあった場合は見つけるための簡単なヒューリスティックを持っていた - 私たちは(私は正確な数字を忘れて - それは設定可能でした)500回以上を横断した場合、答えはイエスでした。ほとんどのサイクルの検出スキームは、このような経験則に頼っています。
私は、過去に同様の問題を持っていました。
「キャッシュ」に気をつけろ。私は、オブジェクトを持っているアイテムを扱っ(「ウィジェット」)(のは「工場」と呼んでみましょう)。ウィジェットは、A)は不変であるという特性を持っていた、そしてB)は、(それが時にはなど、他のウィジェットを作成した)その作成者にshared_ptr<Factory>
を持っていました。私は工場出荷時にウィジェットのキャッシュを追加するまで、すべてが、うまく働いた - ウィジェットは不変だったので、それが要求されたのと同じウィジェット毎回バック手に、それらをキャッシュする意味がありました。私のキャッシュはshared_ptr<Widget>
のキャッシュなので、インスタントサイレント漏れました。修正は明白ですので、私は彼らの中に入ることはありません。
最終的に私はCRTから、このようなメモリリークを検出するために使用したプラットフォーム上で傾くことができました。 Visual StudioのCRTは、私が回帰を防ぐために、私のテストプログラムで使用可能にメモリリークした検出および報告があります:
int main()
{
// code code code
// code code code
#ifdef _MSC_VER
_CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE );
_CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDOUT );
_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE );
_CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDOUT );
_CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE );
_CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDOUT );
_CrtDumpMemoryLeaks();
#endif
}
GCCは、おそらく同様の基本的なリークの報告がありますが、私はそれが何であるかを知らない。
私は、最も簡単な答えはあなたのために何ができるだけでそんなにスマートポインタがあることだと思います:
私は(あなたが一度にすべての3つのオブジェクトを作成する場合...トリッキーそうでない場合は、簡単に)あなたがをいつでも記録のループ、作りを提案し、次にあなたが/リンク解除オブジェクトを削除するには、そのレコードを確認しますか、ただ、定期的にそれができない場合ます。
あなたは、このオブジェクトが所有するshared_ptrsのリストを返しますデバッグインタフェースのいくつかの並べ替えを実装することができます。あなたはshared_ptrのに保存されているすべてのクラスのためにこれを行うために必要があると思います。今あなたが横切ることができる汎用的なグラフを持って、その上に周期検出アルゴリズムを使用することができます。私はこのものの、グラフ理論のために働くかもしれないを信じます私の得意ではありません。