1

私の質問はshared_ptr と weak_ptr の違いに似ていると思いますが、違いのリストではなく、それらがどのように連携するかを見ることに興味があります。

Wikipedia のshared_ptr および weak_ptr状態に関するページはweak_pointer、循環依存関係の問題を解決するために使用でき、例を示しています。

std::shared_ptr<int> p1(new int(5));
std::weak_ptr<int> wp1 = p1; //p1 owns the memory.

{
  std::shared_ptr<int> p2 = wp1.lock(); //Now p1 and p2 own the memory.
  if(p2) //Always check to see if the memory still exists
  { 
    //Do something with p2
  }
} //p2 is destroyed. Memory is owned by p1.

p1.reset(); //Memory is deleted.

std::shared_ptr<int> p3 = wp1.lock(); //Memory is gone, so we get an empty shared_ptr.
if(p3)
{
  //Will not execute this.
}

weak_pointerしかし、循環依存関係が見られないため、問題を解決する方法がわかりません。

a私は、何らかのオブジェクトが objectを指しbbどういうわけかa(weak_ptrチェーンを壊すために有向グラフエッジの 1 つの間にシムを入れて) を指していることを期待していたでしょう。

例は良くて、私の考えは悪いですか? または、問題と解決策のより良い例はありますか?

4

1 に答える 1

1

ウィキペディアのページの現在のバージョンでは、この例はstd::weak_ptr、特に強い循環参照を排除するのではなく、一般的な使用法を示すことを目的としています。(循環参照は、例が提示されたにのみ言及されています。)

この例が示しているのは、 はwp1その寿命にもかかわらず、 が指すメモリを所有しておらず、リセットされるとそのメモリの削除を正しく検出することp1です。言い換えれば、動的に割り当てられたオブジェクトの削除に干渉したり、削除されたオブジェクトが弱いポインターを介して (正しく) アクセスされたときに未定義の動作を引き起こしたりすることはありませんでした。wp1p1wp1

ウィーク ポインターは解放に干渉しないため、参照サイクルを回避するだけでなく、追加のプロパティを格納したり、既存のオブジェクトの計算されたプロパティをキャッシュしたりする連想配列を実装する場合にも役立ちます。このようなキャッシュは割り当て解除に干渉しないため、キャッシュ固有の削除ポリシーを必要とせずに、使用されなくなったときにプライマリ オブジェクトが削除されることに依存できます。

于 2014-12-16T07:36:21.900 に答える