std::shared_ptrのような参照カウント方式のスマートポインタどうしが、互いの管理対象を所有し合う関係になること。

この状態では、外側のstd::shared_ptrが破棄されても、循環の内側で参照カウントが残り続けるため、参照カウントが0にならず、管理対象のオブジェクト(C++)が破棄されないことがある。

たとえば、AがBをstd::shared_ptrで所有し、BもAをstd::shared_ptrで所有すると、AとBは互いに相手の参照カウントを維持し続ける。

この問題を避けるには、循環する関係の少なくとも一方を、所有権を持たない参照であるstd::weak_ptrにする。

参考