2015-04-27 18 views
5

La mia domanda è: quali sono i vari modi in cui può essere usato il membro get() dalla classe shared_ptr? E perché non possiamo usare eliminare per eliminarlo?Quali sono gli usi del membro get() dalla classe shared_ptr?

+4

Si utilizza 'get()' quando è necessario accedere al puntatore raw gestito. E se tu 'cancelli sp.get();' molto probabilmente, e meritatamente, ottieni un comportamento indefinito – Praetorian

+1

Per usare un'API che richiede puntatori grezzi –

+1

Questo mi ricorda molte lune fa (prima di boost :: shared_ptr) quando I ha arrotolato il mio puntatore conteggiato. Ho chiamato il raw pointer accessor 'very_bad_public_method' – Gretchen

risposta

11

se si ha una funzione di prendere un puntatore prime

void f(T *t); // non-owning pointer 

Ed avete avuto un puntatore intelligente a un oggetto T, si potrebbe passare a quella funzione utilizzando get()

std::shared_ptr<T> sp{new T}; // or unique_ptr 
//f(sp); // no good, type mismatch 
f(sp.get()); // passes the raw pointer instead 

API che assumono i puntatori grezzi sono comuni e ancora utili. Ti suggerisco di guardare this part of Herb Sutter's talk da CppCon 2014 e probabilmente le parti che lo circondano.

Si dovrebbe non tentativo di cancellare questo indicatore, le classi di puntatore intelligente assumere non sarà possibile fare una cosa del genere, e sarà ancora liberare l'oggetto gestito nei propri distruttori quando arriva il momento (dopo tutto, come è vero sai che l'hai cancellato?).

Il lavoro del puntatore intelligente è di gestire l'oggetto ed eliminarlo al momento giusto, se si desidera gestire manualmente la durata dell'oggetto (di solito non consigliato), quindi utilizzare un puntatore raw.

Se si desidera assumere la proprietà di un unique_ptr è possibile farlo chiamando release().

+0

[boost anche menzioni] (http://www.boost.org/doc/libs/1_58_0/libs/smart_ptr/shared_ptr.htm#FAQ) visto che puoi usare un deleter personalizzato per i puntatori condivisi, non è banale liberare l'oggetto tramite un puntatore raw (anche se è di proprietà esclusiva). – dyp

4

In genere si utilizza get() quando è necessario passare un puntatore non elaborato a un'API che accetta tale puntatore.

La classe shared_ptr gestisce la proprietà del puntatore, pertanto eliminerà automaticamente la memoria di proprietà al termine della durata del puntatore intelligente. Se si tenta di eliminare la memoria da soli, quando lo shared_ptr tenta di deallocarsi si verificherà un comportamento non definito.

Problemi correlati