繰り返しになりますが、「私の質問です。循環データ構造によって参照カウントがゼロを超えるようになります。C++プログラムで例を挙げて表示してweak_ptrs
ください。例を挙げて、問題をもう一度解決してください。」
この問題は、(概念的には)次のようなC++コードで発生します。
class A { shared_ptr<B> b; ... };
class B { shared_ptr<A> a; ... };
shared_ptr<A> x(new A); // +1
x->b = new B; // +1
x->b->a = x; // +1
// Ref count of 'x' is 2.
// Ref count of 'x->b' is 1.
// When 'x' leaves the scope, there will be a memory leak:
// 2 is decremented to 1, and so both ref counts will be 1.
// (Memory is deallocated only when ref count drops to 0)
質問の2番目の部分に答えるには、参照カウントでサイクルを処理することは数学的に不可能です。したがって、weak_ptr
(基本的には単純化されたバージョンのshared_ptr
)を使用してサイクルの問題を解決することはできません。プログラマーはサイクルの問題を解決しています。
それを解決するには、プログラマーはオブジェクト間の所有権の関係を認識する必要があります。または、そのような所有権が自然に存在しない場合は、所有権の関係を発明する必要があります。
上記のC++コードは、AがBを所有するように変更できます。
class A { shared_ptr<B> b; ... };
class B { weak_ptr<A> a; ... };
shared_ptr<A> x(new A); // +1
x->b = new B; // +1
x->b->a = x; // No +1 here
// Ref count of 'x' is 1.
// Ref count of 'x->b' is 1.
// When 'x' leaves the scope, its ref count will drop to 0.
// While destroying it, ref count of 'x->b' will drop to 0.
// So both A and B will be deallocated.
重要な質問は次のとおりです。weak_ptr
プログラマーが所有権の関係を伝えることができず、特権の欠如または情報の欠如のために静的な所有権を確立できない場合に使用できますか?
答えは次のとおりです。オブジェクト間の所有権が不明確な場合、助けるweak_ptr
ことはできません。サイクルがある場合、プログラマーはそれを見つけて壊さなければなりません。別の解決策は、完全なガベージコレクションを備えたプログラミング言語(Java、C#、Go、Haskellなど)を使用するか、C / C ++で動作する保守的な(=不完全な)ガベージコレクター(Boehm GCなど)を使用することです。 。