Und die Praxis?

Es wird immer viel geschrieben über new, delete und gerne auch mal über die daraus resultierenden Memoryleaks. Leider findet man selten einen Leitfaden, wie man nun am besten Speicher reservieren soll. C++ bietet die erwähnten Möglichkeiten, mit new/new[] und delete/delete[], überlässt es aber dem Programmierer, damit verantwortlich umzugehen. Auch kann man in C++ die Funktionen welche hierfür in C existieren nutzen. So ließe sich zum Beispiel mit malloc, realloc und free auch in einem C++ Programm Speicher reservieren und freigeben. Es gibt sonderfälle, wo dies Sinnvoll ist, generell hat new/delete jedoch einige Vorteile, und ist vom Sprachstandard auch das dafür vorgesehene Werkzeug. Dadurch das man die operatoren new/delete (und ihre Array-Versionen) überladen kann, kann man auch diesen Aspekt noch sehr genau definieren für jedes Programm.
Da C++ auch hier eine sehr freie Sprache ist, bleibt es dem Programmierer überlassen, wie er dies nun zu tun hat.

Aus meinem Blickwinkel einige wichtige Faustregeln:
  • Den Stack bevorzugen, und nur größere Objekte und solche mit längerer Lebensdauer als der lokale Stack mit new anlegen.
  • Bei new[] immer überlegen, ob man nicht auch einen std::vector auf dem Stack nutzen kann, oder ein Smartarray, welches sich um die Freigabe kümmert.
  • Smartpointer/arrays benutzen, wenn möglich. Sie sind eine gute Alternative, und nehmen dem Programmierer etwas Arbeit ab.
  • Darauf achten, das kein mit new angelegter Speicher durch das Umbiegen des darauf zeigenden Pointers verwaist. Wenn es keinen Pointer mehr gibt, der auf einen allokierten Speicherblock zeigt, kann das Programm auf diesen Speicherbereich und seine Daten und Objekte nicht mehr zugreifen!
  • Tools wie Cppcheck können Memoryleaks in eigenem und fremden Code finden.