33

「強いポインター」と「弱いポインター」の概念に混乱しています。ダイアン・ハックボーン自身は次のように述べています。

強いポインターがある間、オブジェクトは残ります。最後のものが解放されると、それは破棄されます。弱いポインターでできることは、比較して強いポインターに昇格しようとすることだけです。オブジェクトに他の強力なポインターがない場合、後者は失敗します。

これは私には非常に不明確です。ストロング ポインターは ( 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 とほぼ同等です。したがって、基本的に、弱いポインターは、参照するオブジェクトをいつでも削除できます。

4

3 に答える 3

39

spはAndroidでStrongPointerを意味し、参照カウントが0に等しい場合、ポイントされたオブジェクトによって占有されていたメモリが解放されます。wpはWeakPointerを意味するため、弱いポインターがある場合、参照されるオブジェクトが生きているかどうかは関係ありません。 。一部のキャッシュおよび比較シナリオで使用される場合があります。

まず、StrongPointer.hのsp実装を簡単に見てみましょう。

これは、参照カウントの単なるラッパーです。例えば、

template<typename T> template<typename U>
sp<T>& sp<T>::operator = (U* other)
{
    if (other) ((T*)other)->incStrong(this);
    if (m_ptr) m_ptr->decStrong(this);
    m_ptr = other;
    return *this;
}

によってストロングポインタを作成する場合sp<IBinder> strongPointer、m_ptrは参照されるオブジェクトです。ソースコードでわかるように、spテンプレートは強力なポインタを表すだけなので、このspを保持している限り、システムはメモリを解放しません。参照カウンターは保持されません。カウンターはRefBaseクラスで維持されます。また、StrongPointerを使用するには、objがRefBaseのインスタンスである必要があります。

RefBaseクラスは、強参照カウンターと弱参照カウンターの両方を維持します。唯一の違いは、強が0にカウントされると、参照オブジェクトが解放されることです。さらに、Refbaseによって管理されるオブジェクトの場合、一部の強ポインターと弱ポインタ​​ーによって同時に参照される場合があります。

AndroidフレームワークでStrongPointersが広く使用されていることがわかります。それらのほとんどは、IBinderオブジェクト上にあり、ネイティブバインダーオブジェクトはさまざまなプロセスを通過できます。異なるプロセスが同じオブジェクトへの強力なポインターを保持できます。1つのプロセスがポインターを保持している限り、オブジェクトはシステムによって取り消されません。

于 2013-03-19T06:05:12.157 に答える
14

Androidは、CではなくJavaでプログラムすることを目的としています。Androidチームのドキュメントはすべて、その言語を参照しています。Javaには、強参照と弱参照があります。弱い参照はガベージコレクターによるクリーンアップを停止しませんが、強い参照は停止します。これらは一部のOSでのキャッシュに使用されますが、3.0以降のAndroidでは、オブジェクトへの弱い参照のみを保持しているため、オブジェクトはすぐに収集されます。

Cにはガベージコレクションがないため、弱参照に相当するものはありません。

于 2013-03-18T20:52:27.187 に答える
2

これは、通常の参照 (または " StrongReferenceSoftReference " )、 s、WeakReferences、さらにPhantomReferenceは Java の s の違いについて説明している素敵な投稿です。弱参照

于 2013-03-18T20:56:24.220 に答える