Shared Ownership:
Der shared_ptr
und weak_ptr
der 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_ptr
diese Option , um die gemeinsam genutzte Ressource zu beobachten, ohne ihre Lebensdauer zu beeinflussen, und um Zyklen nicht zu unterbrechen. Zyklen mit shared_ptr
sollten 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_ptr
ist boost::scoped_ptr
auf 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_delete
r) verwendet. std::unique_ptr<T[]>
bietet auch operator[]
anstelle von operator*
und operator->
.
Beachten Sie, dass dies std::auto_ptr
noch im Standard enthalten ist, jedoch veraltet ist .
§D.10 [depr.auto.ptr]
Die Klassenvorlage auto_ptr
ist 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_ptr
und verwenden weak_ptr
- Sie können testen , ob die Eltern shared_ptr
leben 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 expired
nur 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.