Warum Zeiger im Boost Bereich

9

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.

    
Jimm 24.05.2012, 00:02
quelle

4 Antworten

4

Nicht, wenn es sich um eine dynamische Größe oder einen dynamischen Typ handelt. Darüber hinaus können Bereichszeiger vertauscht werden, und in C ++ können 11 unique_ptr verschoben werden, so dass sie nicht streng beschränkt sind.

    
Puppy 24.05.2012 00:06
quelle
4

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

%Vor%

Dies ist mit einfacher stackbasierter Zuweisung nicht wirklich möglich.

Siehe auch: C ++ 0x unique_ptr ersetzt scoped_ptr, das den Besitz übernimmt ?

    
nobar 24.05.2012 00:31
quelle
2

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.

%Vor%     
Tony The Lion 24.05.2012 00:06
quelle
1

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%     
mohaps 24.05.2012 00:08
quelle

Tags und Links