1. ホーム
  2. c++

[解決済み] shared_ptrとweak_ptrの違い

2023-06-17 21:28:59

質問

Scott Meyers の Effective C++" の本を読んでいます。その中で、以下のようなものがあると書かれていました。 tr1::shared_ptrtr1::weak_ptr は組み込みポインタのように動作しますが、このポインタは tr1::shared_ptrs がオブジェクトを指し示していることを記録します。

これは参照カウントとして知られています。これは非周期的なデータ構造におけるリソースリークを防ぐのに有効ですが、もし2つ以上のオブジェクトに tr1::shared_ptrs を含む場合、サイクルへの外部ポインタがすべて破壊されたとしても、サイクルは互いの参照カウントをゼロより上に維持する可能性があります。

そこで tr1::weak_ptrs が入ってきます。

私の質問は、どのように周期的なデータ構造が参照カウントを0以上にするのかということです。親切にもC++のプログラム例をお願いします。この問題を解決するために weak_ptrs ? (再度、例題をお願いします)。

どのように解決するのですか?

A shared_ptr は、生のポインタに参照カウント機構を巻き付けます。そのため、各インスタンスに対して shared_ptr のインスタンスごとに参照カウントが1ずつ増加します。もし2つの share_ptr オブジェクトがお互いを参照している場合、参照カウントがゼロになることはないので、それらは決して削除されることはありません。

weak_ptrshared_ptr を指しますが、その参照カウントは増加しません。 これは、未使用のオブジェクトは weak_ptr への参照があっても削除できることを意味します。

この仕組みは weak_ptr を使用することができます。 shared_ptr を作成することができます。しかし、そのオブジェクトがすでに削除されている場合は、空の shared_ptr の空のインスタンスが返されます。基礎となるオブジェクトの参照カウントは weak_ptr 参照で増加しないので、循環参照は基礎となるオブジェクトが削除されないという結果にはなりません。