2012-06-10 15 views
10

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

+3

Ma 'weak_ptr' non ha un metodo' get'. –

+0

Derp. Non ho letto la domanda –

risposta

15

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.

+0

Chiamare 'lock' per una parte più ampia del codice ha davvero molto più senso. Buona decisione di progettazione – abergmeier

4

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.

+2

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. –

+0

@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 ... –

+1

No, ottenere il puntatore è sicuro, a patto che sia fatto * internamente *. –

Problemi correlati