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.
+1 per lo sforzo di spiegare questo concetto – miller