Gibt es einen allgemeinen intelligenten Zeiger wie auto_ptr und shared_ptr, der C ++ 0x nicht benötigt?

8

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:

  • Kann in Factory-Methoden verwendet werden, so dass das Eigentum beim Kopieren übertragen wird (wie auto_ptr)
  • Unterstützt release() (wie auto_ptr)
  • Kann mit Vorwärtsdeklaration (wie shared_ptr)
  • verwendet werden

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.

    
the_mandrill 22.09.2010, 09:17
quelle

3 Antworten

5

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:

unique_ptr boost äquivalent?

    
Martin B 22.09.2010, 09:28
quelle
2

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 .

    
Wernight 22.09.2010 09:45
quelle
2

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.

    
sellibitze 22.09.2010 10:02
quelle

Tags und Links