new & delete

Wie schon erwähnt, kann man in C++ mit new dynamisch Speicher allokieren. Da es in C++ von sich aus keinen Garbagecollector gibt, ist der Programmierer auch für die Freigabe des allokierten Speichers verantwortlich:
int* npi = new int;
*npi = 42;
// do something with npi
delete npi;


npi wird erst mit new im Heap angelegt, new gibt dann den Pointer auf npi zurück. In C++ ist es so, das man auf Speicher im Heap nur über einen Pointer oder eine Referenz zugreifen kann. Da ja eine 'normale' Variable automatisch auf dem Stack liegt. Deshalb gibt new immer einen Pointer zurück, falls new fehlschlägt, kann new in älteren Implementationen 0 zurückgeben, laut Standard müsste es jedoch eine std::bad_alloc Exception werfen. Um auf den Inhalt von npi zu zugreifen, muss dieser (wie jeder andere Pointer auch) dereferenziert werden. Eine mit new angelegte Variable muss noch initialisiert werden, wie dies hier in der zweiten Zeile geschieht. Nur bei Klassen geschieht dies automatisch durch einen Konstruktoraufruf. Wenn die im Heap angelegte Variable nicht mehr benötigt wird, muss diese mit delete wieder freigegeben werden.

Natürlich ist es nur bedingt sinnvoll eine int Variable mit new anzulegen, eine Verwendung wäre als Counter, welcher als Pointer im Programm entsprechend herumgereicht wird. In C++ wird new vor allem in Zusammenhang mit Klassen und Objektorientierung genutzt. Es ist immer besser eine Variable nicht auf dem Heap sondern auf dem Stack abzulegen, besonders wenn es um Variablen geht, welche wenig Speichern benötigen.

Leider wird in vielen C++ Tutorials nicht die Existenz von Smartpointern erwähnt. Vor C++11 gab es in der STL nur std::auto_ptr<T>, ein Nachteil dieser Klasse ist, das sie den Besitz des Pointers bei call by Value an die neu erstellte Instanz übergibt. Dies führt zu dem Effekt dass wenn diese Instanz temporär ist, danach delete aufgerufen wird. Mit C++11 gibt es nun auch im C++ Standard weitere Smartpointer Implementierungen, welche einen Pointer auch teilen können. Hierbei dienten die Smartpointer aus boost als Vorbild. Mit dem Template boost::shared_ptr<T> (oder std::shared_ptr<T> in C++11) kann man eine Variable anlegen, welche eine im Heap angelegte Variable kapselt. Eine Instanz eines Smartpointers wird sollte auf dem Stack angelegt, so dass die Variable automatisch wieder beim verlassen des Scopes freigeben werden kann. Wobei shared_ptr hier ein Reference Counting implementiert, so dass erst die letzte Instanz welche aus dem Original hervorging, den Speicher auch wieder freigibt. Möchte man einen Smartpointer haben, der auf einen bestimmten Scope (z.B. einer Funktion) begrenzt ist, so kann man auch scoped_ptr<T> nutzen. Ein weitere Vorteil der Smartpointer ist, dass sie Exception sicher sind. Der Speicher wird also auch gelöscht, wenn eine Exception fliegt.