「強いポインター」と「弱いポインター」の概念に混乱しています。ダイアン・ハックボーン自身は次のように述べています。
強いポインターがある間、オブジェクトは残ります。最後のものが解放されると、それは破棄されます。弱いポインターでできることは、比較して強いポインターに昇格しようとすることだけです。オブジェクトに他の強力なポインターがない場合、後者は失敗します。
これは私には非常に不明確です。ストロング ポインターは ( boost::
) 共有ポインターと同等ですか? また、自分自身を強いポインターに昇格させようとするだけの場合、弱いポインターの役割は何ですか? 同様に、弱いポインターと強いポインターが必要になるのはいつですか?
アップデート:
sp
皆様ありがとうございます。具体的には Android のカーネルとについて質問wp
しています。それらは Java のリファレンスとはまったく関係ありません。
基本的に私はここでコードをクラックしようとしていますhttp://www.androidenea.com/2010/03/share-memory-using-ashmem-and-binder-in.htmlsp
と
の使用を本当に理解していませんwp
アップデート:
実際の答えは、受け入れられた答えのコメントにあります。Gabe Sechan に感謝します。
ストロング ポインターとウィーク ポインターは異なるスマート ポインターの実装であり、ほぼ同じことを行います。ポインターがスコープ外になると、少なくとも 1 つのストロング ポインターがそれを参照している限り、ポインターは解放されません。弱いポインターのみが参照する (または何も参照しない) 場合は、そうなります。それへの強参照または弱参照がスコープ解除されるたびに、チェックが行われます。
同じオブジェクトを参照する 10 個の弱いポインターがあり、それらの 10 個のうちの 1 つが範囲外になると、オブジェクトは破棄されますか? 一方、強力なポインターでは、10 個すべてがスコープ外になった場合にのみ、オブジェクトが破棄されますか?
はい、ほとんどです。10 個のウィーク ポインターしかない場合、最後のストロング ポインターが範囲外になったときに、おそらく既に範囲外になっているでしょう。予備のメモリがあれば、実装によってもう少し長く存続できるかもしれませんが、メモリが不足した状態になると、実装が彼女の引用から進んでいるようには思えず、チョップされます. そして、これの使用は依然として主にキャッシングです。これは、boost shared_ptr および boost weak_ptr とほぼ同等です。したがって、基本的に、弱いポインターは、参照するオブジェクトをいつでも削除できます。