2013-03-18 38 views
20

Sono confuso con la nozione di "puntatore forte" e "puntatore debole". Diane Hackborn stessa ha detto che:Cosa sono i puntatori potenti e i puntatori deboli

L'oggetto rimarrà in giro mentre ci sono punti forti; è distrutto una volta che l'ultimo è stato rilasciato. Tutto quello che puoi fare con un debole puntatore è il confronto e il tentativo di promuovere un puntatore forte; quest'ultimo fallirà se non ci sono altri puntatori forti sull'oggetto .

Che per me non è chiaro. Un puntatore forte è equivalente a un puntatore condiviso (boost::)? E qual è il ruolo di un puntatore debole se è lì solo per tentare di promuoversi con un puntatore forte? Come, quando abbiamo bisogno di indicatori deboli e forti?

Aggiornamento:

Grazie a tutti, ma mi sto chiedendo in particolare su kernel di Android sp e wp, e non hanno nulla a che fare con i riferimenti di Java a tutti.

Fondamentalmente sto cercando di decifrare il codice qui http://www.androidenea.com/2010/03/share-memory-using-ashmem-and-binder-in.html E non capisco l'uso di sp e wp

Aggiornamento:

La risposta reale si trova nei commenti del accettata risposta. Grazie a Gabe Séchan:

forti e deboli puntatori sono diverse implementazioni puntatore intelligente e fanno circa la stessa cosa: quando un puntatore esce dall'ambito, così a lungo come almeno un puntatore forti riferimenti essa non lo farà essere liberato. Se solo riferimenti deboli (o nulla) sarà. Il controllo è eseguito ogni volta che viene visualizzato un riferimento forte o debole ad esso.

se ho 10 puntatori deboli che fanno riferimento allo stesso oggetto e uno di quelli 10 non rientrano nell'ambito, l'oggetto verrà distrutto? Considerando che con i puntatori potenti , solo quando tutti e 10 di essi escono dall'ambito verrà distrutto l'oggetto ?

Sì, quasi. Se tutto ciò che hai sono 10 punti deboli, probabilmente sono già fuori portata, quando l'ultimo puntatore forte è uscito dallo dell'ambito. L'implementazione potrebbe consentire di mantenere un po 'più a lungo il se c'è la memoria di riserva, ma sarà ridotta se si passa a in una condizione di memoria insufficiente e non sembra che la loro implementazione sia avanzata rispetto alla sua citazione. E l'uso di questo è ancora ancora principalmente caching - è approssimativamente equivalente a un boost shared_ptr e aumenta weak_ptr. Quindi, in sostanza, un puntatore debole può avere l'oggetto , i riferimenti vanno via in qualsiasi momento.

+0

+1 per lo sforzo di spiegare questo concetto – miller

risposta

7

Android è pensato per essere programmato in Java, non C. Qualsiasi documentazione del team Android farebbe riferimento a tale lingua. In Java ci sono riferimenti forti e deboli.Un riferimento debole non impedisce al garbage collector di ripulirlo, fa un riferimento forte. Sono utilizzati per il caching su alcuni sistemi operativi, ma su Android a partire dal 3.0 con solo riferimenti deboli a un oggetto significa che verranno raccolti immediatamente.

C non ha un equivalente di riferimento debole, in quanto non ha garbage collection.

+4

Attualmente sto programmando il kernel di Android quindi niente Java, grazie comunque. –

+5

Quindi non dovresti essere interessato a riferimenti deboli o forti :-) – fedepaol

+0

@fedepaol mi ha battuto per questo ... – Simon

22

sp significa StrongPointer in Android, il la memoria occupata dall'oggetto puntato verrà liberata se il conteggio di riferimento è uguale a 0. wp indica WeakPointer, quindi se ho un puntatore debole, non mi interessa se l'oggetto di riferimento è vivo o no. Potrebbe essere utilizzato in alcuni scenari di cache e di confronto.

Per prima cosa, dare un'occhiata rapida all'implementazione sp in StrongPointer.h.

È semplicemente un wrapper per il conteggio dei riferimenti. Ad esempio,

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; 
} 

Se si crea un forte Pointer dal sp<IBinder> strongPointer, il m_ptr è l'oggetto di riferimento. Come puoi vedere nel codice sorgente, il template sp rappresenta solo un puntatore forte in modo che il sistema non liberi la memoria finché tengo questa sp. Non mantiene un contatore di riferimento. Il contatore viene mantenuto nella classe RefBase. E per usare StrongPointer, il tuo obj deve essere un'istanza di RefBase.

La classe RefBase mantiene sia il contatore di riferimento forte che il contatore di riferimento debole, l'unica differenza è che l'oggetto di riferimento verrà liberato se il forte conta fino a 0. Inoltre, per un oggetto gestito da Refbase, può fare riferimento a Strong Pointers e Puntatori deboli simultaneamente.

È possibile vedere un uso intensivo di StrongPointers nel framework Android, la maggior parte di questi sono su un oggetto IBinder, un oggetto binder nativo può essere passato attraverso diversi processi. Diversi processi possono contenere potenti puntatori a uno stesso oggetto, l'oggetto non verrà revocato dal sistema fintanto che un processo continua a contenere il puntatore.

+0

Perché la classe 'sp' non mantiene il conteggio dei riferimenti come fa' std :: shared_pointer'? Qual è il vantaggio di suddividere le responsabilità in questo modo? – Adrian

+0

Questo dovrebbe essere contrassegnato come la risposta ... –

Problemi correlati