Shared Ownership:
Der shared_ptrund weak_ptrder angenommene Standard entsprechen weitgehend denen der Boost-Kollegen . Verwenden Sie sie, wenn Sie eine Ressource freigeben müssen und nicht wissen, welche als letzte am Leben sein wird. Verwenden Sie weak_ptrdiese Option , um die gemeinsam genutzte Ressource zu beobachten, ohne ihre Lebensdauer zu beeinflussen, und um Zyklen nicht zu unterbrechen. Zyklen mit shared_ptrsollten normalerweise nicht stattfinden - zwei Ressourcen können sich nicht besitzen.
Beachten Sie, dass Boost zusätzlich Angebote bietet shared_array, die eine geeignete Alternative zu sein könnten shared_ptr<std::vector<T> const>.
Als nächstes bietet Boost Angebote an intrusive_ptr, die eine einfache Lösung darstellen, wenn Ihre Ressource bereits ein Management mit Referenzzählung bietet und Sie es in das RAII-Prinzip übernehmen möchten. Dieser wurde vom Standard nicht übernommen.
Einzigartiges Eigentum:
Boost hat auch ein scoped_ptr, das nicht kopierbar ist und für das Sie keinen Deleter angeben können. std::unique_ptrist boost::scoped_ptrauf Steroiden und sollte Ihre Standardwahl sein, wenn Sie einen intelligenten Zeiger benötigen . Es ermöglicht Ihnen, einen Deleter in seinen Vorlagenargumenten anzugeben und ist im Gegensatz zu beweglichboost::scoped_ptr . Es kann auch vollständig in STL-Containern verwendet werden, solange Sie keine Vorgänge verwenden, für die (offensichtlich) kopierbare Typen erforderlich sind.
Beachten Sie erneut, dass Boost eine Array-Version hat : scoped_array, die der Standard vereinheitlicht, indem eine std::unique_ptr<T[]>teilweise Spezialisierung erforderlich ist, die delete[]den Zeiger anstelle des delete(mit dem default_deleter) verwendet. std::unique_ptr<T[]>bietet auch operator[]anstelle von operator*und operator->.
Beachten Sie, dass dies std::auto_ptrnoch im Standard enthalten ist, jedoch veraltet ist .
§D.10 [depr.auto.ptr]
Die Klassenvorlage auto_ptrist veraltet. [ Hinweis: Die Klassenvorlage unique_ptr(20.7.1) bietet eine bessere Lösung. - Endnote ]
Kein Besitz:
Verwenden Sie dumme Zeiger (Rohzeiger) oder Referenzen für nicht besitzende Verweise auf Ressourcen und wenn Sie wissen, dass die Ressource das referenzierende Objekt / den überlebenden Bereich überlebt . Bevorzugen Sie Referenzen und verwenden Sie Rohzeiger, wenn Sie entweder Nullbarkeit oder Rücksetzbarkeit benötigen.
Wenn Sie eine nicht-besitzende Referenz auf eine Ressource, aber Sie wissen nicht , ob die Ressource das Objekt überleben wird , dass Verweise darauf in einer die Ressource packen shared_ptrund verwenden weak_ptr- Sie können testen , ob die Eltern shared_ptrleben mit lock, die Geben Sie a zurück shared_ptr, das nicht null ist, wenn die Ressource noch vorhanden ist. Wenn Sie testen möchten, ob die Ressource tot ist, verwenden Sie expired. Die beiden mögen ähnlich klingen, unterscheiden sich jedoch bei gleichzeitiger Ausführung erheblich, da expirednur der Rückgabewert für diese einzelne Anweisung garantiert wird. Ein scheinbar unschuldiger Test wie
if(!wptr.expired())
something_assuming_the_resource_is_still_alive();
ist eine mögliche Rennbedingung.