サイクルを含む実用的な用途は、かなりの数の種類のグラフです。些細なスニペット (実際には起こりそうにないことですが) は次のようになります。
struct node {
node *next;
};
int create_cycle() {
node *a = new node;
a.next = a;
}
create_cycle が戻った後、割り当てたばかりのノードにはそれ自体への参照が含まれていますが、他にポイントがないため、ガベージであっても参照カウンターはそれを収集しません。
Chris Jester-Young は、実用的な観点から、スマート ポインターを使用したサイクル ブレークを既に扱っています。ただし、内部でどのように機能するかについては、実際の詳細には触れませんでした。
weak_ptr は、一種の二重間接ポインターです。つまり、weak_ptr はオブジェクトに直接アクセスできません。代わりに、オブジェクトに到達するには、weak_ptr を shared_ptr に変換し、それを使用してオブジェクトに到達する必要があります。管理対象オブジェクト (そのため、オブジェクトの参照カウントはゼロではなく、まだ存在しています)。
そのため、weak_ptr は、オブジェクトが存在する限りオブジェクトへのアクセスを提供しますが、オブジェクトが存在しなくなったことを「認識」し、オブジェクトが存在していた (現在は解放された) メモリへのアクセスを提供しません。破壊されました。
サイクルの回避は、作業している物の種類によって異なります。グラフを頻繁に扱う場合 (一例として)、モデル化する対象のかなりの数にサイクルがあるため、グラフを回避することはほとんど不可能です。それ以外の場合は...場合によって異なります。かなりの数の開発者が、サイクルを含むリンクされた構造を作成する必要なしにキャリア全体を終えたと思います。平均的な週に数回行う人もいるでしょう。
他のスマート ポインターに関する限り、上記のように、weak_ptr 型は shared_ptr と連携して機能します。weak_ptr を使用しなくても shared_ptr を使用できますが、weak_ptr を実際に使用するには、ある時点でそれを shared_ptr に変換する必要があります。