Ich brauche nicht wirklich die Objekte zu teilen, aber ich möchte sicherstellen, dass kein Speicherverlust auftritt. Ist es korrekt in diesem Fall shared_ptr zu verwenden?Ich kann nicht std :: vector von auto_ptr verwenden - sollte ich shared_ptr verwenden?
Antwort
Wenn Sie Boost verwenden, könnte boost::ptr_vector besser für Ihre Bedürfnisse geeignet sein.
Wenn nicht, dann können Sie entweder shared_ptr
wie vorgeschlagen verwenden oder die Elemente des Vektors manuell löschen, wenn Sie damit fertig sind.
Aus Wartungssicht wäre shared_ptr
die bevorzugte Lösung. Beachten Sie jedoch, dass shared_ptr
einige Leistungseinbußen mit sich bringen kann, die für Ihre Anwendung von Bedeutung sein können oder auch nicht.
Es ist ein bisschen ein Overkill, aber es gibt keinen viel besseren intelligenten Zeiger dafür. Sie können auch die Pointer-Container von Boost in Betracht ziehen. In C++ 0x können Sie std::unique_ptr
in Containern speichern, was näher an Ihren Bedürfnissen liegt
Ich verwende boost :: shared_ptr – amitlicht
+1 für Container von unique_ptr! – AshleysBrain
Sie können auch Boost.PointerContainer verwenden. Mit einem shared_ptr
drückt Shared Ownership aus. Wenn Sie jetzt sicher sind, dass Ihre Objekte an die Lebensdauer des Containers gebunden sind, dann ist eine PointerContainer die bessere Option für das Design (ist das überhaupt ein Wort?).
Wenn Low-Level-Performance/Speicherverbrauch keine kritischen Anforderungen sind (dh 97% aller Fälle), dann gehen Sie einfach mit shared_ptr. Es ist einfach und gut verstanden.
Wenn Sie wirklich die Dinge festhalten und/oder die Besitzabsicht präzisieren wollen, dann ist boost::ptr_vector vielleicht besser - aber wenn Ihre Klasse keinen anderen Speicher verwaltet, dann ist das manuelle Löschen in Ihrem Destruktor nicht so groß Sünde, wie wir manchmal glauben gemacht werden ;-) Ich bin ein großer RAII-Befürworter, mache das aber immer noch von Zeit zu Zeit.
- 1. Sollte ich std :: unique_ptr <T> in einer std :: vector Membervariable in meiner Klasse verwenden?
- 2. Verwenden von Boost Python & std :: shared_ptr
- 3. Verwenden benutzerdefinierter Deleter mit Std :: shared_ptr
- 4. Verwenden von Std Shared_ptr als Std :: Map Key
- 5. std :: unique_ptr vs std :: shared_ptr vs std :: weak_ptr vs std :: auto_ptr vs raw Zeigern
- 6. Soll ich std :: default_random_engine verwenden oder sollte ich std :: mt19937 verwenden?
- 7. Soll ich den Zeiger std :: shared verwenden?
- 8. Zeiger vs auto_ptr vs shared_ptr
- 9. Sollte ich Bootstrap verwenden?
- 10. Sollte ich Fremdschlüssel verwenden?
- 11. Sollte ich jQuery.each() verwenden?
- 12. Sollte ich jQuery.inArray() verwenden?
- 13. C++ Speichern großer Daten in std :: list <> .. sollte ich Referenzzählung verwenden?
- 14. Kann ich Pointer-Arithmetik auf einem STL :: vector :: iterator verwenden
- 15. Wie implementiere ich Polymorphie mit std :: shared_ptr?
- 16. Warum kann ich eine Instanz von std :: make_shared nicht als Zeiger verwenden?
- 17. Warum sollte ich AutoDual nicht verwenden?
- 18. Sollte ich Klassenvererbung verwenden oder nicht?
- 19. Verwenden von shared_ptr für refcounting
- 20. Warum sollte ich glBindAttribLocation verwenden?
- 21. Warum kann ich nicht std :: vector mit Listeninitialisierung initialisieren
- 22. Sollte ich Interface Builder verwenden oder nicht?
- 23. Verwendung von std :: shared_ptr
- 24. Wann sollte ich getElementById verwenden?
- 25. Wann sollte ich RESTful verwenden?
- 26. Vererbung von std :: vector
- 27. Sollte ich boost :: ptr_vector <T> oder Vektor <boost :: shared_ptr <T>> verwenden?
- 28. Was sollte ich "htonl" verwenden?
- 29. Sollte ich EAV-Modell verwenden?
- 30. Kann ich einen Parameter an eine std :: vector Sortierfunktion übergeben?
Sind die im Vektor gespeicherten Objekte dynamisch zugeordnet? Müssen sie sein? –