Graph および Node クラスによって実装された有向非巡回グラフがあります。各ノードには、子へのポインターのリストと、親へのポインターのリストがあります。一部のアルゴリズムは親リストへの高速アクセスを要求し、グラフは小さく、ノードあたりの接続数が少ないため、最近親を追加しました。メモリの問題はありません。
子リストは std::shared_ptr を使用して、ノードが少なくとも親を持つ限りメモリ内に保持されるようにします。しかし、ノードに親を所有させたくないので、親へのポインターにweak_ptrを使用しました。
しかし、アルゴリズムに問題がありました。アルゴリズムは、weak_ptr から新しい shared_ptr を作成する必要があるため、operator== を直接使用することはできず、std::find() などの標準関数を使用するには、my_weak_ptr.lock() を呼び出して比較するラムダ関数を作成する必要があります。一部の shared_ptr に。
shared_ptr に切り替えると、ノードの削除を担当するコードの小さなバグがメモリ リークにつながる可能性があります。または、既に削除されたノードへのポインターがある場合、コードは存在しないはずのノードにアクセスできるため、バグを見つけるのが非常に難しくなる可能性があります。ただし、shared_ptr での作業は、逆参照/削除などを行わないという点で、weak_ptr と同じくらい安全です。想定されていない場合は (生の C++ ポインターよりも優れています)、weak_ptr とは異なり、shared_ptr は逆参照できるため、std::find() を直接使用できます。
ここに「より良い」設計がありますか、それとも、weak_ptr::lock() の余分な操作を行うか、見つけにくいバグのリスクを冒すかどうかに応じて、この特定の状況の問題ですか?