Ich habe verschiedene Smart Pointer-Implementierungen evaluiert (wow, es gibt eine Menge da draußen) und es scheint mir, dass die meisten von ihnen in zwei breite Klassifikationen kategorisiert werden können:Was ist der beste Weg, um intelligente Zeiger in C++ zu implementieren?
1) Diese Kategorie verwendet Vererbung auf der Objekte, auf die verwiesen wird, so dass sie Referenzzählungen haben und normalerweise up() und down() (oder deren Äquivalente) implementiert sind. IE, um den intelligenten Zeiger zu verwenden, müssen die Objekte, auf die Sie zeigen, von einer Klasse erben, die die ref-Implementierung bereitstellt.
2) Diese Kategorie verwendet ein sekundäres Objekt, um die Referenzzählungen zu speichern. Zum Beispiel, anstatt den Smart Pointer direkt auf ein Objekt zu richten, zeigt es tatsächlich auf dieses Metadatenobjekt ... Wer hat eine Referenzzählung und up() und down() Implementierungen (und wer stellt normalerweise einen Mechanismus für den Zeiger zur Verfügung Holen Sie sich das tatsächliche Objekt, auf das gezeigt wird, so dass der intelligente Zeiger operator ->() korrekt implementieren kann.
Nun hat 1 den Nachteil, dass alle Objekte, auf die Sie verweisen möchten, von einem gemeinsamen Vorgänger geerbt werden. Dies bedeutet, dass Sie damit nicht auf Zählobjekte verweisen können, die Sie nicht steuern können über den Quellcode zu.
2 hat das Problem, dass, da die Zählung in einem anderen Objekt gespeichert ist, wenn Sie jemals eine Situation haben, dass ein Zeiger auf ein vorhandenes Referenzobjekt in eine Referenz konvertiert wird, haben Sie wahrscheinlich einen Fehler (IE, da der count befindet sich nicht im eigentlichen Objekt, es gibt keine Möglichkeit, dass die neue Referenz den count bekommt ... ref ref copy Konstruktion oder Zuweisung ist in Ordnung, weil sie das count-Objekt teilen können, aber wenn Sie jemals von einem konvertieren müssen Zeiger, du bist total abgespritzt) ...
Jetzt, wie ich es verstehe, verwendet boost :: shared_pointer Mechanismus 2, oder so ähnlich ... Das sagt, ich kann mich nicht ganz entscheiden, was ist schlimmer! Ich habe immer nur Mechanismus 1 im Produktionscode verwendet ... Hat jemand Erfahrung mit beiden Stilen? Oder vielleicht gibt es einen anderen Weg, der besser ist als diese beiden?
Darüber hinaus ist die Boost-Version von shared_ptr in TR1 migriert und wird so schließlich Standard-C++ - Bibliothek sein. –
Ein Leistungsvergleich von Boost Smart Pointer ist hier: http://www.boost.org/doc/libs/1_39_0/libs/smart_ptr/smarttests.htm –