Ich möchte einen Smart Zeiger ohne Referenzzählung, der einige der nützlichen Aspekte von auto_ptr
und shared_ptr
kombinieren kann. Ich denke, dass C ++ 0x unique_ptr
ist letztlich was ich brauche, aber ich brauche etwas, das auf Visual Studio 2008 und Xcode (gcc 4.2) kompilieren wird.
Die Funktionalität, die ich brauche, ist:
release()
(wie auto_ptr) Also, ich denke, es ist wirklich ein besseres auto_ptr
. Gibt es irgendwas, das das in Boost oder anderswo tut (Anmerkung: Ich habe nicht die Zeit, meinen Kopf um Loki zu wickeln)? Oder soll ich einfach meine eigene rollen?
BEARBEITEN: Ich habe gerade mehr über auto_ptr
gelesen - es klingt wie Sie kann es mit Forward-Deklarationen verwenden, wenn Sie sicherstellen, dass der Klassenheader in jeder .cpp-Datei enthalten ist Verweise auf den Header mit dem Smart Pointer (siehe zB GotW ). Hat jemand einen allgemeinen Rat oder Faustregeln dazu?
EDIT2: Der Grund, warum shared_ptr nicht akzeptabel ist, liegt daran, dass ich eine release () -Methode benötige, da ich Legacy-Code durch Einführung von Factory-Methoden aufräume, aber es muss mit einem Code für den manuellen Pointer co-existieren. Die Verwendung von shared_ptr in der Codebase wäre großartig, aber eine große Aufgabe.
EDIT3: Am Ende war auto_ptr
ausreichend für den Job, nachdem ich die Macken der Vorwärtseinbeziehung entdeckt hatte. Es wäre auch interessant, zu versuchen, einen benutzerdefinierten Löschvorgang für shared_ptr
zu schreiben, um das optionale Löschen des Zeigers zu ermöglichen.
Bearbeiten: In meiner ursprünglichen Antwort konnte ich nicht verstehen, dass boost::shared_ptr
für Sie nicht akzeptabel ist (wahrscheinlich aus Leistungsgründen).
auto_ptr
unterstützt, wie Sie bemerken, die Vorwärtsdeklaration. Sie müssen den Header für die referenzierte Klasse an jenen Stellen einfügen, die das Objekt zerstören können, auf das von auto_ptr
verwiesen wird. Beachten Sie jedoch, dass die Semantik von auto_ptr
leicht skurril ist und etwas Sorgfalt erfordert.
Die Antworten auf die folgende Frage enthalten weitere Informationen, einschließlich des Grundes, warum unique_ptr
nur für C ++ 0x implementiert werden kann, da rValue-Verweise erforderlich sind:
C ++ TR1 (unterstützt von modernem GCC und Visual Studio) enthält shared_ptr
und andere (vgl. Wikipedia) . Diese wurden meist von Boost übernommen, was für so ziemlich jeden modernen Compiler funktioniert.
Wenn Sie eine strikte Eigentümerschaft benötigen, können Sie die scoped_ptr
überprüfen .
Mit einigen Standardcode können Sie ungefähr unique_ptr
in C ++ 03. Es ist keine perfekte Emulation. Sie benötigen zum Beispiel einige explizite move
-Aufrufe, um eine lokale unique_ptr
zurückgeben zu können.
Tags und Links c++ smart-pointers shared-ptr