Mindestens genau so wichtig, wenn nicht sogar wichtiger ist allerdings die Frage, wieso man überhaupt gerade etwas am Heap allokieren will...
Also mir ist ja klar, dass man Variablen am Stack schneller anlegen kann als am Heap. Aber was ich mich frage ist, wie man weitestgehend auf den Heap verzichten können soll.
Sagen wir ich habe eine dynamische Anzahl an Spielobjekten. Dann führt im Grunde kein weg daran vorbei, dass sie am Heap landen. Außerdem würde ich sie im Normalfall in einen std-Container packen, und da werden Objekte nunmal hin und her kopiert. Also nehme ich einen Container mit std::uniqu_ptr, weil ich keine Lust habe, komplexe Objekte zu kopieren. Aber selbst wenn ich keine Zeiger im Container hätte, da er dynamisch alloziert ist, wären die Objekte doch so oder so am Heap. Was wäre also dein Vorschlag?
Zu shared_ptr: Benutze ich eigentlich nie. Wenn ein Objekt von mehreren anderen Objekten benutzt wird, kann man meistens eines davon als den Besitzer ausfindig machen, dieser hat dann einen unique_ptr, während die anderen dann nur einen normalen raw-pointer benutzen. Oder halt eine Referenz. Es muss nur sichergestellt sein, dass der Besitzer länger lebt als alle Benutzer, aber das ist in der Regel sehr einfach.
Das schöne an unique_ptr ist dann auch, dass du explizit modellierst, wer Besitzer und wer Benutzer ist. Und wenn du Zeiger an Funktionen übergibst, siehst du schon an der Deklaration, ob das Objekt den Besitzer wechselt oder nicht. Wenn du das konsequent machst, kannst du garantieren, dass jedes dynamisch erzeugte Objekt immer genau einen Besitzer hat und auch garantiert freigegeben wird, sobald es nicht mehr benötigt wird. Das ist um ein vielfaches effizienter als jeder Garbage-Collector. Und es macht den Code schöner und aussagekräftiger. Meiner Meinung nach hat C++ damit die schönste und sauberste Speicherverwaltung aller Programmiersprachen die ich kenne.