weak_ptr
サイクルを断ち切る必要があることは知っていますが、それは問題が発見された後の修正です。循環参照を検出または回避するために使用できるパターンまたはツールはありますか?
4 に答える
設計上、これを回避します。Stephan T. Lavavej が GoingNative2012 カンファレンス (オンラインでビデオをチェックできます) で非常にうまく指摘したように、「所有権」は有向非巡回グラフ、つまり DAG です。DAG にはサイクルはありません。オーナーシップ グラフが DAG でない場合、A が B を所有し、B が A を所有することは意味がないため、設計に問題があります。ただし、shared_ptr は「共有所有権ポインター」です。そのようなポインターを保持するオブジェクトまたはスコープは、ポインティング先を所有します。所有権グラフの観点から考えてみてください。
shared_ptr は、すべてのケースに適したツールではありません。たとえば、所有権について (あまり) 考える必要がない Java で行うようにコーディングできるようにすることは想定されていません。自動で決定論的なクリーンアップを提供するはずです。「非所有」ポインターが必要な場合は、weak_ptr または生のポインターが適切です。生のポインタが指しているオブジェクトが十分長く存続することを確認してください。
明白な答えは、shared_ptr
それ自体にshared_ptr
. shared_ptr
はやや特殊であり、慎重に使用する必要があります。
私はセリビッツェが言ったことに強く同意し、デザインを再考します. あなたが本当に持っているのが一方向の所有権であり、単に反対方向を観察するだけの場合は、weak_ptr を検討してください。これにより、オブジェクトが生きているかどうかを確認できますが、オブジェクトへのポインタがあるという理由だけでオブジェクトを生きたままにすることはできません。
smart_ptr
作成時にポインターを格納するラッパーのようなものを実装できthis
ます(たとえば、マクロによって)。this
次に、格納されたオブジェクトから格納されたオブジェクトへのエッジを使用して有向グラフを作成しshared_ptr
、トポロジカル ソートなどによってサイクルを検出します。
shared_ptr
これは、集中的に使用され、すべての設計面を制御できない大規模なコード ベースにのみお勧めします。それ以外の場合は、@sellibitze の推奨事項を使用してください。