Was ist das Ziel von Bereichszeiger? Zu meinem Verständnis verwaltet der Bereichszeiger den Speicher innerhalb eines Codeblocks. Wenn ich eine Variable innerhalb eines Blocks deklarieren möchte, kann ich sie einfach auf einem Stapel deklarieren und muss mich nicht um das Putzen kümmern.
Im Gegensatz zu stackbasierten Daten hat scoped_ptr ein reset () -Member - mit anderen Worten, Sie können nach Herzenslust konstruieren / destruieren. Damit können Sie einen Null-Zeiger (technisch operator unspecified-bool-type
) als ein Flag verwenden, das anzeigt, ob zu irgendeinem Zeitpunkt ein konstruiertes Objekt vorhanden ist oder nicht. Es ermöglicht Ihnen auch, die Konstruktion / Zerstörung unabhängig vom Variablenumfang zu sequenzieren, falls dies erforderlich ist.
Beachten Sie auch, dass Sie einen scoped_ptr als Klassenmitglied und nicht nur als Stapelvariable deklarieren können. Die Dokumentation schlägt vor, mit scoped_ptr das Handle / Body-Idiom zu implementieren (um die Implementierungsdetails der Klasse zu verbergen).
Um schließlich den Punkt von DeadMG zu erläutern: "Nicht wenn es vom dynamischen Typ ist", können Sie scoped_ptr verwenden, um ein polymorph
Dies ist mit einfacher stackbasierter Zuweisung nicht wirklich möglich.
Siehe auch: C ++ 0x unique_ptr ersetzt scoped_ptr, das den Besitz übernimmt ?
Der Punkt ist, dass Sie einen Zeiger innerhalb eines bestimmten lexikalischen Bereichs erstellen und bereinigen können. Dies kann in einer Vielzahl von Situationen nützlich sein, und es stellt sicher, dass Sie keine Speicherlecks haben, indem Sie delete
vergessen, wenn Sie new
explizit verwenden, was nicht empfohlen wird.
Sie sollten bedenken, dass das boost::scoped_ptr
nicht kopierbar ist und seine Ressource somit für die gesamte Lebensdauer besitzt. Dies macht es auch sicherer als boost::shared_ptr
, da es verhindert, dass die Ressource kopiert oder versehentlich geteilt wird.
Gewöhnlich haben Thread-Stapel Speichergrenzen (siehe thread stacksize).
Manchmal wurde der Zeiger möglicherweise auch von außen an Sie übergeben und muss in diesem Bereich gelöscht werden (z. B. wenn eine Ausnahme ausgelöst wird, werden alle Löschaufrufe unterhalb dieser Zeile nicht ausgeführt). Du brauchst also eine automatische Reinigung des Mauszeigers.
%Vor%Tags und Links c++ boost scoped-ptr