これは私のデザインが悪いということですか?
はい、しかしそれは出発点です。
使用できるスマート ポインターのいくつかを考えてみましょう。
unique_ptr- オブジェクトの処分を担当する単一の所有者が存在します。
shared_ptr- 多くの (または潜在的に多くの) 所有者が存在し、最後の所有者がオブジェクトを破棄する必要がある
weak_ptr- 多くの所有者が存在する可能性がありますが、これはそれらの 1 つではありません。ウィーク ポインターは、指しているオブジェクトが無効になる可能性があります。指しているオブジェクトが破棄された場合、ウィーク ポインターは null になります (つまり、lock メソッドは null の shared_ptr を返します)。
observer_ptr(n3840) - まだ標準の一部ではないため、必要に応じて代わりに C スタイルのポインター (T*) を使用できます。これらはweak_ptrと非常によく似た働きをしますが、指すオブジェクトが破棄された後にすべてのオブザーバーが逆参照されないようにするのはプログラマーの責任です。
解決策は、すべてのピースとピース (サイクル ノード) を所有するオブジェクトにデザインを分割することです。所有するオブジェクトは、shared_ptrまたはを使用unique_ptrして、ノードの寿命を自動的に管理できます。weak_ptrノード自体は、 、observer_ptr、または参照 (Node&) で相互に参照できます。