2008-09-22 13 views
11

Wir alle wissen, dass RAW-Pointer in irgendeine Form von Smart-Pointer verpackt werden müssen, um eine Exception-sichere Speicherverwaltung zu erhalten. Aber wenn es um Behälter mit Zeigern geht, wird das Thema dorniger.Zeiger und Container

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

Aber es gibt auch einige Boost-Container explizit entworfen halten sicher Zeiger:
Siehe Pointer Container Library

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> > 

Antwort

13

Boost-Zeiger Container strenge Eigentum über die Mittel verfügen, die sie halten. A std :: vector < boost :: shared_ptr < X >> hat das Eigentum geteilt. Es gibt Gründe, warum das notwendig sein könnte, aber falls nicht, würde ich boost :: ptr_vector < X> standardmäßig. YMMV.

1

Nun, Overhead ist ein Fall.

Ein Vektor von geteilten Zeigern wird eine Menge von externem Kopieren durchführen, das das Erstellen eines neuen intelligenten Zeigers, Inkrementieren eines Verweises, Dekrementieren eines Verweises usw. auf einer Größenänderung beinhaltet. All dies wird mit einem Pointer-Container vermieden.

Erfordert Profilierung der Container-Operationen sind der Engpass, um sicherzustellen, obwohl :)

3

Immer in Bewegung: Smart Pointer sind eine sehr gute Methode, um Ressourcen zu verwalten, aber nicht die einzige. Ich stimme zu, dass Sie in gut geschriebenem C++ - Code sehr wenige rohe Zeiger sehen werden, aber meiner Erfahrung nach werden Sie auch nicht viele intelligente Zeiger sehen. Es gibt viele perfekt ausnahmesichere Klassen, die mit Containern roher Zeiger implementiert sind.

+0

Es ist möglich und manchmal die beste Option, aber wenn eine Klasse enthält 2 oder mehr RAW-Zeigern, so dass es Ausnahme sicher ist, ist nicht trivial. Aber ich sollte dich abmelden, weil du die Frage nicht beantwortet hast. –