2013-03-18 6 views
20

"強いポインタ"と "弱いポインタ"という概念と混同しています。 ダイアン・ハックボーン自身が言った:強いポインタと弱いポインタとは

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

どちらが私にはっきりしていません。強力なポインタは、(boost::)の共有ポインタと同等ですか?また、強力なポインタに自分自身を宣伝しようとしている場合、弱いポインタの役割は何ですか?私たちはいつ弱く強い指針を必要としますか?

更新:

はあなたにみんなありがとう、私はAndroidのカーネルspwpについて特に求めている、と彼らはすべてのJavaの参照とは何の関係もありません。

基本的に私はここにhttp://www.androidenea.com/2010/03/share-memory-using-ashmem-and-binder-in.html をコードを解読しようとしていると、本当にspの使用を理解していないとwp

更新:

実際の答えは受け入れられたのコメントであります回答。ゲイブSechanのおかげ:

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

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

はい、ほとんどです。あなたが持っているものがすべて弱いポインタである場合、最後に強いポインタがスコープの になったときに、すでに がスコープから外れている可能性があります。この実装では少しのメモリしか持たないかもしれません スペアメモリがある場合は長くなりますが、 にメモリが足りない場合は切り捨てられ、 の実装は彼女の見積もりよりも進んでいるようです。そしてこれを使用するのは依然として ですが、これは主にキャッシングです。これは、boost_firstr とboost_wptrとおおよそ同等です。だから、基本的に、弱いポインタは、オブジェクトがいつでも離れて行く参照 を持つことができます。

+0

+1この概念を説明するために+1 – miller

答えて

7

AndroidはJavaではプログラミングされていますが、Cではプログラミングされていません。Androidチームのドキュメントはその言語を参照します。 Javaでは、強参照と弱参照があります。弱参照は、ガベージコレクタがそれをクリーンアップするのを止めるわけではありません。それらはいくつかのOSでのキャッシュに使用されますが、オブジェクトの弱い参照のみを保持する3.0のAndroidでは、すぐに収集されることを意味します。

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

+4

実際に私はアンドロイドのカーネルをプログラミングしているので、Javaはありません。とにかく感謝します。 –

+5

弱いまたは強い参照に興味があるべきではありません:-) – fedepaol

+0

@fedepaolは私にそれを打ち負かしました... – Simon

22

SPは、AndroidでStrongPointerを意味し、 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によって管理されるオブジェクトの場合、弱いポインタを同時に。

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

+0

クラス 'sp'は' std :: shared_pointer'のように参照カウントを保持しません。このような責任を分かち合うことの利点は何ですか? – Adrian

+0

これは答えとしてマークする必要があります... –