web-dev-qa-db-ja.com

強いポインターと弱いポインターとは

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

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

それは私にはかなり不明確です。強力なポインタは(boost::)共有ポインタ?そして、それだけで強いポインタに昇格しようとする場合に弱いポインタの役割は何ですか?たとえば、弱いポインタと強いポインタが必要になるのはいつですか。

更新:

皆さん、ありがとうございました。Androidのカーネルspwpについて具体的にお伺いします。Javaのリファレンスとはまったく関係ありません。

基本的に私はここでコードをクラックしようとしています http://www.androidenea.com/2010/03/share-memory-using-ashmem-and-binder-in.html そして、しないでくださいspwpの使い方を本当に理解している

更新:

実際の答えは、受け入れられた答えのコメントにあります。 Gabe Sechanに感謝します。

強いポインタと弱いポインタは異なるスマートポインタの実装であり、同じことを行います。少なくとも1つの強いポインタがそれを参照している限り、ポインタがスコープ外になると解放されません。弱いポインタのみ(または何も)が参照しない場合は、それが参照されます。チェックは、それへの強い参照または弱い参照がデスコープされるたびに行われます。

同じオブジェクトを参照する10個のウィークポインターがあり、そのうちの1つがスコープ外になると、オブジェクトは破棄されますか?一方、強力なポインタでは、10個すべてが範囲外になった場合にのみ、オブジェクトが破棄されますか?

はい、ほぼ。弱いポインターが10個しかない場合は、最後の強いポインターがスコープから外れたときに、おそらくすでにスコープから外れているでしょう。実装では、予備のメモリがある場合は少し長く留まる可能性がありますが、メモリ不足の状態になると、実装が彼女の引用から進んでいるように聞こえない場合は途切れます。そして、これの使用はまだ主にキャッシングです-それはおおまかにshared_ptrをブーストし、weak_ptrをブーストすることと同等です。したがって、基本的に、ウィークポインターは、参照するオブジェクトをいつでも削除できます。

26
Yukio Fukuzawa

AndroidはCではなくJavaでプログラミングされることを意図しています。Androidチームのドキュメントはすべてその言語を参照します。Javaには、強い参照と弱い参照があります。弱い参照はガベージコレクターによるクリーンアップの妨げにはなりませんが、強い参照はガベージコレクターによるクリーンアップを妨げません。一部のOSではキャッシュに使用されますが、Androidオブジェクトは、すぐに収集されることを意味します。

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

12
Gabe Sechan

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つのプロセスがまだポインターを保持している限り、オブジェクトはシステムによって取り消されません。

31
StarPinkER

これは、Javaでの通常の参照(または "StrongReference")、SoftReferences、WeakReferences、さらにはPhantomReferencesの違いを説明する素晴らしい投稿です。以下をお楽しみください: http ://weblogs.Java.net/blog/2006/05/04/understanding-weak-references

3
Emil Davtyan