Nur shared_ptr. Mit auto_ptr können Sie NUR EINE Referenz auf Ihr Objekt haben. Auch auto_ptr ist nicht langsamer, es muss schneller als shared_ptr arbeiten.
Um solche Fragen nicht zu stellen, müssen Sie wissen, wie diese intelligenten Zeiger funktionieren.
auto_ptr nur Zeiger auf Ihr Objekt speichern und es in seinem Destruktor zerstören.
Das Problem von auto_ptr ist, dass wenn Sie versuchen, es zu kopieren, es stoppt, um auf Ihr Objekt zu zeigen.
Zum Beispiel
auto_ptr a_ptr (new someclass);
auto_ptr another_ptr = aptr; // danach zeigt ein anderes_ptr auf deine Klasse, aber a_ptr zeigt nicht mehr darauf!
Deshalb empfehle ich Sie nicht, auto_ptr zu verwenden.
Geteilter Zeiger, der zählt, wie viel intelligente Zeiger auf Ihr Objekt zeigen und Ihr Objekt zerstören, wenn es keine Zeiger mehr darauf gibt. Deshalb können Sie mehr als einen Zeiger auf Ihr Objekt haben.
Aber Shared Pointer ist auch nicht perfekt.Und wenn du in deinem Programm einen zyklischen Graph hast (wenn die Klassen A und B und A ein Element shared_ptr haben, das auf B zeigt und B die Mitgliedsobjekte shared_ptr auf A zeigen), dann werden A und B niemals gelöscht und du wirst habe Speicher lecken.
Um korrekten Code mit shared_ptr zu schreiben, müssen Sie vorsichtig sein und auch weak_ptr verwenden. Weitere Informationen finden Sie hier http://www.boost.org/doc/libs/1_45_0/libs/smart_ptr/smart_ptr.htm
Wählen Sie nicht intelligente Zeiger basierend auf wahrgenommene Effizienz (für einen Menschen sind absolut schrecklich bei der Wahrnehmung von Effizienz und wie gezeigt, in der Regel falsch). Wählen Sie den Smart-Zeiger, der zeigt, wie Sie den Zeiger erwarten. Wenn Sie Eigentumsrechte übertragen, ist auto_ptr in Ordnung, wenn Sie ein implizit gemeinsam genutztes Objekt erstellen, ist shared_ptr besser. –