Non ho davvero bisogno di condividere gli oggetti, ma voglio assicurarmi che non ci siano perdite di memoria. E 'corretto usare shared_ptr in questo caso?Non riesco a usare std :: vector di auto_ptr - dovrei usare shared_ptr?
risposta
Se si utilizza boost, boost::ptr_vector potrebbe essere più adatto alle proprie esigenze.
In caso contrario, è possibile utilizzare shared_ptr
come suggerito o eliminare manualmente gli elementi del vettore una volta terminato.
Dal punto di vista della manutenzione, shared_ptr
sarebbe la soluzione preferita. Si noti, tuttavia, che lo shared_ptr
può comportare alcune penalità in termini di prestazioni, che possono essere o non essere significative per la propria applicazione.
È un po 'eccessivo, ma per questo non esiste un puntatore intelligente molto migliore. Potresti anche prendere in considerazione i contenitori del puntatore di boost.
In C++ 0x sarà possibile memorizzare std::unique_ptr
in contenitori, che è più vicino alle proprie esigenze.
Sto usando boost :: shared_ptr – amitlicht
+1 per contenitori di unique_ptr! – AshleysBrain
È inoltre possibile utilizzare Boost.PointerContainer. L'utilizzo di un shared_ptr
esprime la proprietà condivisa. Ora, se sei sicuro, che i tuoi oggetti sono legati alla durata del contenitore, allora un PointerContainer è l'opzione migliore in termini di progettazione (è anche una parola?).
Se le prestazioni di basso livello/l'utilizzo della memoria non sono requisiti critici (ovvero il 97% di tutti i casi), basta andare con shared_ptr. È semplice e ben compreso.
Se si vuole davvero mantenere le cose strette e/o esprimere l'intenzione di proprietà in modo più preciso, allora boost::ptr_vector potrebbe essere migliore - ma se la classe non gestisce altra memoria, l'eliminazione manuale del distruttore non è così grande peccato come a volte siamo portati a credere ;-) Sono un grande sostenitore della RAII, ma lo faccio ancora di tanto in tanto.
- 1. Ha senso usare std :: shared_ptr <std::vector> invece di boost :: shared_array?
- 2. Devo usare std :: default_random_engine o dovrei usare std :: mt19937?
- 3. std :: auto_ptr a std :: unique_ptr
- 4. Pointers vs auto_ptr vs shared_ptr
- 5. Quando dovrei usare std :: thread :: detach?
- 6. std :: unique_ptr vs std :: auto_ptr vs std :: weak_ptr vs std :: auto_ptr vs puntatori grezzi
- 7. Perché non dovrei usare Unity?
- 8. Perché non dovrei usare atoi()?
- 9. Perché non usare sempre std :: forward?
- 10. Perché dovrei usare Drools?
- 11. C# Quando dovrei usare List e quando dovrei usare l'arraylist?
- 12. Quando dovrei usare AQL?
- 13. quale algoritmo dovrei usare?
- 14. Perché dovrei usare gitignore?
- 15. Perché dovrei usare glBindAttribLocation?
- 16. Quale doctype dovrei usare?
- 17. Quale PreApplicationStartMethod dovrei usare?
- 18. quale di == e =: = dovrei usare?
- 19. Perché dovrei usare io_service :: work?
- 20. Quante attività dovrei usare?
- 21. Quando dovrei usare ConcurrentSkipListMap?
- 22. Quale dovrei usare? decimal.Add() o "+"
- 23. Quando dovrei usare CompiledQuery?
- 24. dovrei usare RoutedEventHandler
- 25. Perché non riesco a usare auto in una funzione Swift
- 26. Quando dovrei usare \ A in un'espressione regolare?
- 27. Quando dovrei usare std :: async con sincronizzazione come criterio?
- 28. Perché dovrei usare funzioni divergenti?
- 29. boost :: ptr_container e std :: vector <shared_ptr>
- 30. Come gestire l'evoluto C++ std :: namespace? es: std :: tr1 :: shared_ptr vs. std :: shared_ptr vs boost :: shared_ptr vs boost :: tr1 :: shared_ptr
Gli oggetti memorizzati nel vettore sono allocati dinamicamente? Devono essere? –