私は依存性注入 (テスト駆動開発) の目的で多くのインターフェイスを使用しています。このため、多くのオブジェクトは std::shared_ptr を介してポイントされます。私は std::unique_ptr を使用していたでしょうが、Google のモック時に必要なコピー コンストラクターがありません。
循環参照が発生した場合に早期に検出するために、どのような対策を講じることができますか?
私はグーグルテストでLinuxプラットフォームに取り組んでいます。
私は依存性注入 (テスト駆動開発) の目的で多くのインターフェイスを使用しています。このため、多くのオブジェクトは std::shared_ptr を介してポイントされます。私は std::unique_ptr を使用していたでしょうが、Google のモック時に必要なコピー コンストラクターがありません。
循環参照が発生した場合に早期に検出するために、どのような対策を講じることができますか?
私はグーグルテストでLinuxプラットフォームに取り組んでいます。
共有ポインタを使用して循環参照を自動的に検出することは不可能です。循環参照を検出するために使用する手法の1つは、次の方法で明示的に検出することです。グローバルにアクセス可能な状態を維持しstd::vector< T* >
、すべてのctorでオブジェクトをベクトルに追加してから、dtorでオブジェクトを削除します。次に、メインの最後で、ベクトルが空であることを確認します。空でない場合は、どこかに循環参照がある可能性があり、ベクトルはどこを追跡するのに役立ちます。静的に割り当てられたオブジェクトが所有するポインタを共有している場合、特に静的な初期化順序の大失敗が適用されるため、誤検知が発生しやすくなります。
ブーストではBOOST_SP_ENABLE_DEBUG_HOOKS
、すべてのタイプに対してこのアプリケーションを幅広く実行できる定義があります。
同種のオブジェクト (つまりNode -> Node -> Node ...
) のグラフがある場合は、通常のサイクル検出アルゴリズムを使用できます。
グラフが異種 (Document -> Element -> Table -> Document
または何でも) である場合、それをトラバースするのは面倒すぎるかもしれませんが、巧妙なカスタム イテレータ型を使用すればおそらく実現可能です。
その場合、おそらくweak_ptr
静的に識別可能なサイクルを壊すために使用して、循環がないように所有権のセマンティクスを構造化するのがより一般的です。