Im Gegenteil, Sie sollten immer Stapelzuordnungen bevorzugen, sofern Sie als Faustregel niemals Neu / Löschen in Ihrem Benutzercode haben sollten.
Wie Sie sagen, wenn die Variable auf dem Stapel deklariert wird, wird ihr Destruktor automatisch aufgerufen, wenn sie den Gültigkeitsbereich verlässt. Dies ist Ihr Hauptwerkzeug zur Verfolgung der Ressourcenlebensdauer und zur Vermeidung von Lecks.
Wenn Sie also eine Ressource zuweisen müssen, egal ob es sich um Speicher (durch Aufrufen von new), Dateihandles, Sockets oder etwas anderes handelt, schließen Sie sie im Allgemeinen in eine Klasse ein, in der der Konstruktor die Ressource abruft und der Destruktor sie freigibt. Anschließend können Sie ein Objekt dieses Typs auf dem Stapel erstellen, und Sie können sicher sein, dass Ihre Ressource freigegeben wird, wenn sie den Gültigkeitsbereich verlässt. Auf diese Weise müssen Sie Ihre neuen / gelöschten Paare nicht überall verfolgen, um Speicherlecks zu vermeiden.
Der gebräuchlichste Name für diese Redewendung ist RAII
Schauen Sie sich auch Smart-Pointer-Klassen an, mit denen die resultierenden Zeiger in den seltenen Fällen umbrochen werden, in denen Sie außerhalb eines dedizierten RAII-Objekts etwas mit new zuweisen müssen. Sie übergeben den Zeiger stattdessen an einen intelligenten Zeiger, der dann seine Lebensdauer beispielsweise durch Referenzzählung verfolgt und den Destruktor aufruft, wenn die letzte Referenz den Gültigkeitsbereich verlässt. Die Standardbibliothek verfügt std::unique_ptr
über eine einfache bereichsbasierte Verwaltung, std::shared_ptr
die Referenzzählungen zur Implementierung von gemeinsamem Besitz durchführt.
Viele Tutorials demonstrieren die Objektinstanziierung mithilfe eines Snippets wie ...
Sie haben also festgestellt, dass die meisten Tutorials scheiße sind. ;) In den meisten Tutorials lernen Sie miese C ++ - Praktiken, einschließlich des Aufrufs von new / delete, um Variablen zu erstellen, wenn dies nicht erforderlich ist, und der Schwierigkeit, die Lebensdauer Ihrer Zuordnungen zu verfolgen.