Mentre io capisco il motivo per cui non v'è alcuna operator==
per shared_ptr
e unique_ptr
, mi chiedo perché non ce n'è per shared_ptr
e weak_ptr
. Soprattutto perché è possibile creare un weak_ptr
tramite un riferimento su shared_ptr
. Suppongo che per il 99% del tempo tu voglia lhs.get() == rhs.get()
. Vorrei ora andare avanti e introdurlo nel mio codice, a meno che qualcuno non possa nominarmi una buona ragione, perché non si dovrebbe fare una cosa del genere.mancante parità tra shared_ptr e weak_ptr
risposta
weak_ptr
non ha un metodo get()
perché è necessario bloccare esplicitamente lo weak_ptr
prima di poter accedere al puntatore sottostante. Rendere questo esplicito è una decisione progettuale intenzionale. Se la conversione fosse implicita, sarebbe molto facile scrivere codice che non sarebbe sicuro se l'ultimo shared_ptr
dell'oggetto fosse distrutto mentre il puntatore sottostante ottenuto da weak_ptr
era ancora in fase di esame.
This boost page ha una buona descrizione delle insidie e perché weak_ptr
ha un'interfaccia così limitata.
Se è necessario eseguire un confronto veloce, è possibile eseguire shared == weak.lock()
. Se il confronto è vero, si sa che weak
deve essere ancora valido poiché si dispone di uno shared_ptr
separato per lo stesso oggetto. Non esiste tale garanzia se il confronto restituisce false.
Chiamare 'lock' per una parte più ampia del codice ha davvero molto più senso. Buona decisione di progettazione – abergmeier
Perché ha un costo.
A weak_ptr
è come un osservatore, non un vero puntatore. Per fare qualsiasi lavoro con esso è necessario prima ottenere uno shared_ptr
usando il suo metodo lock()
.
Questo ha l'effetto di acquisire la proprietà, ma è costoso quanto copiare un normale shared_ptr
(conteggio incrementale, ecc.) Quindi non è nulla di banale.
Come tale, non fornendo ==
, si è costretti a fare un passo indietro e verificare effettivamente se ne hai davvero bisogno o no.
Non sono sicuro che confrontare l'uguaglianza debba preoccuparsi della validità, e come tale potrebbe essere implementato a buon mercato: o il "weak_ptr" si riferisce alla stessa entità, nel qual caso deve essere valido (o 0), o si riferisce a un'altra entità, nel qual caso non ci interessa se è valido. –
@KonradRudolph: forse, forse no. Ma poiché ottenere il puntatore non sarebbe sicuro in generale (dato che si avrebbe il puntatore ma non si sarebbe in grado di accedere al puntale), non si può ottenere il puntatore da 'weak_ptr' e si è costretti a passare un' shared_ptr'. Quindi ... –
No, ottenere il puntatore è sicuro, a patto che sia fatto * internamente *. –
- 1. std :: weak_ptr: lock o shared_ptr costruttore?
- 2. Conversione da shared_ptr a weak_ptr polymorphism
- 3. Differenze tra tr1 :: shared_ptr e boost :: shared_ptr?
- 4. boost :: python e weak_ptr: roba che scompare
- 5. Come interrompere il riferimento ciclico shared_ptr utilizzando weak_ptr
- 6. E 'corretto restituire null shared_ptr?
- 7. Schema di osservatore utilizzando weak_ptr
- 8. serializzazione shared_ptr e tra applicazioni C# e C++?
- 9. Avendo un vettore di weak_ptr, voglio restituire un vettore di shared_ptr
- 10. È garantito che weak_ptr scadrà quando shared_ptr viene reimpostato sullo stesso indirizzo che contiene?
- 11. weak_ptr di una classe base, mentre il parametro shared_ptr è di una classe derivata?
- 12. Come risolvere il conflitto tra boost :: shared_ptr e usando std :: shared_ptr?
- 13. QList e shared_ptr
- 14. Apple e shared_ptr
- 15. Rompere i riferimenti ciclici con std :: weak_ptr e alias costruttore: suono o problema?
- 16. Differenze tra diversi sapori di shared_ptr
- 17. Controllo parità di interfaccia {}
- 18. Portable hack per individuare il puntatore raw da weak_ptr
- 19. const shared_ptr to shared_ptr
- 20. Creazione di shared_ptr senza thread
- 21. Dichiarazioni di inoltro e shared_ptr
- 22. spinta serializzare e std :: shared_ptr
- 23. shared_ptr e riferimenti in C++
- 24. std :: shared_ptr e inizializzazione liste
- 25. Parità di funzioni in Haskell
- 26. Overhead e implementazione dell'utilizzo di shared_ptr
- 27. perché non posso lanciare nullptr a weak_ptr <>
- 28. std :: map con std :: chiave weak_ptr
- 29. C++ pointer raw e std :: shared_ptr
- 30. Creazione di weak_ptr <> dal puntatore raw
Ma 'weak_ptr' non ha un metodo' get'. –
Derp. Non ho letto la domanda –