2つのオブジェクトが互いに std::shared_ptr で保持し合うとメモリリークが起きます。これを避けるために片方に使うべきスマートポインタはどれですか?
shared_ptr 同士が循環参照すると、互いの参照カウントが0にならず、オブジェクトが解放されません。これを避けるには、片方を std::weak_ptr にします。weak_ptr は所有権を持たず、参照カウントを増やさない観測用のポインタです。使うときは lock() で shared_ptr を取得し、対象がすでに破棄されていれば空のポインタが返ります。親子関係では、親から子を shared_ptr、子から親を weak_ptr で持つ設計が典型的です。なお auto_ptr はC++17で削除されています。