Frage

Wir alle wissen, dass RAW-Zeiger müssen in irgendeiner Form von intelligenten Zeiger gewickelt werden Exception sichere Speicherverwaltung zu erhalten. Aber wenn es um Container von Zeigern kommt das Problem wird immer dornig.

Die std Behälter bestehen auf das enthaltene Objekt ist kopierbar, so dies die Verwendung von std :: auto_ptr Regeln aus, obwohl Sie noch boost verwenden können :: shared_ptr etc.

Aber es gibt auch einige boost Container explizit entworfen Zeiger sicher zu halten:
Siehe Pointer Container-Bibliothek

Die Frage ist: Unter welchen Bedingungen sollte ich lieber die ptr_containers über einen Behälter von smart_pointers benutzen?

boost::ptr_vector<X>

or

std::vector<boost::shared_ptr<X> >
War es hilfreich?

Lösung

Boost-Zeiger-Container haben strenges Eigentum über die Ressourcen, die sie halten. A std :: vector > gemeinsame Verantwortung hat. Es gibt Gründe, warum das notwendig sein kann, aber falls dies nicht der Fall, würde ich :: ptr_vector steigern Standard. YMMV.

Andere Tipps

Immer mit der Ruhe: intelligente Zeiger sind eine sehr gute Methode der Handhabung Ressourcen-Managements, aber nicht die einzige. Ich bin damit einverstanden Sie werden nur sehr wenige rohe Zeiger in gut geschriebenen C ++ Code sehen, aber in meiner Erfahrung, die Sie nicht sehen, dass viele intelligente Zeiger entweder. Es gibt viele perfekt Ausnahme sichere Klassen Container von rohen Zeigern implementiert.

Nun, Overhead ist ein Fall.

Ein Vektor des gemeinsamen Zeigers wird eine Menge von Fremd Kopieren tun, das einen neuen Smart-Pointer umfasst das Erstellen eine Referenz Inkrementieren, Dekrementieren eine Referenz, etc. auf einer Größe ändern. All dies wird mit einem Zeiger Behälter vermieden.

Benötigt Profilierung der Container-Operationen sind die Engpass obwohl zu gewährleisten:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top