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?
risposta
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()
.
[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
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.
- 1. Quali sono gli usi del buffer circolare?
- 2. Quali sono gli usi dei generi polimorfici?
- 3. Quali sono gli usi comuni di UDP?
- 4. Quali sono gli usi pratici del modulo (%) nella programmazione?
- 5. Quali sono gli usi del predicato di errore in Prolog?
- 6. Quali sono gli usi esatti del termine REALM in sicurezza?
- 7. Quali sono gli usi positivi dei moduli in pacchetto OCaml?
- 8. Quali sono gli usi delle funzioni virtuali pure in C++?
- 9. Quali sono gli usi di iter (callable, sentinel)?
- 10. Quali sono gli usi corretti di @NonNull e @Nullable?
- 11. Quali sono gli usi positivi della proprietà css `content`?
- 12. Quali sono tutti gli usi di '@' in C#?
- 13. Quali sono gli usi migliori degli archivi di documenti?
- 14. Quali sono gli usi popolari e contemporanei di Perl?
- 15. Quali sono alcuni usi interessanti per gli agenti Java?
- 16. Quali sono gli usi pratici di un costruttore protetto?
- 17. Quali sono alcuni usi intelligenti di LINQ?
- 18. Quali sono alcuni usi dei metadati Clojure?
- 19. Quali sono gli usi pratici del modello di metodo di fabbrica?
- 20. Quali sono gli stati del thread Dalvik?
- 21. Domande sugli usi di shared_ptr - C++
- 22. Cosa sono i campionatori di ombre in OpenGL e quali sono gli usi possibili per loro?
- 23. Quali sono gli usi comuni delle variabili di condizione in C++?
- 24. Quali sono gli intrinsechi?
- 25. Quali tipi di domande sono gli Incidenti del supporto tecnico?
- 26. Quali sono alcuni usi legittimi specifici per i singleton?
- 27. Quali sono gli eventi Ember.js per TextField Classe
- 28. R: quali sono gli slot?
- 29. Quali sono alcuni usi interessanti delle funzioni di ordine superiore?
- 30. Quando usi shared_ptr dovrei semplicemente usare la dichiarazione shared_ptr una volta o dichiarare shared_ptr ovunque la passino?
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
Per usare un'API che richiede puntatori grezzi –
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