Also ich mag shared_ptr nicht besonders. Ich benutze unique_ptr, wenn ein Objekt ein Objekt ein anderes besitzt bzw. verwaltet und normale Pointer, wenn ich nur eine Referenz darauf will.
Klassisches Beispiel für shared_ptr: Ressourcen (Texturen, 3D-Modelle, ...), die von mehreren Objekten benutzt werden und erst dann gelöscht werden dürfen, wenn sie von keinem mehr benötigt werden.
Ja schon, nur die Frage ist, woher man die Ressourcen dann bekommt? Wenn sie von einem zentralen Manager kommen, muss der auch in irgendeiner Form eine Referenz darauf haben, und somit auch darüber benachrichtigt werden, wenn eine Ressource endgültig nicht mehr benötigt wird.
Noch eine Frage: Kann ich statt unique_ptrs auch shared_ptrs verwenden? Besonders weil die Nodes evtl. kopiert werden müssen.
Aus welchem Grund könnte es Sinn ergeben, Nodes zu kopieren? In C++11 gibt es jetzt Move-Semantik, die von unique_ptr voll unterstützt ist und wirklich sehr sehr elegant ist.
Letztendlich funktioniert meiner Meinung nach RAII erst durch uniqu_ptr / move-Semantik wirklich, ist damit aber um Längen effizienter und robuster als jeder Garbage-Collector der Welt. Beherzigt man es konsequent, muss man sich um Memory-Leaks keine Gedanken mehr machen. Der Preis ist, dass man sich über sein Programm Gedanken machen muss, man muss also beim Programmieren auch mitdenken.