Placement new

Eine Besonderheit in C++ ist, schon allokierten Speicher mit new verwenden zu können. Dies ist insbesondere nützlich, wenn man einen Container oder eigenen Speicherpool implementieren will. Im C++ Alltag der meisten Programmierer wird Placement new keine große Rolle spielen, nützlich ist es immer dann, wenn man schon allokierten Speicher hat, und diesen nun mit einem Objekt belegen will. Dabei wird dann in diesem Speicher die Instanz des Objektes angelegt. Auch kann es vorkommen, da man Placement new zusammen mit einer Überladung des new/delete Operators nutzt. Wichtig zu wissen ist, das sich Placemenet new nicht um die Allokierung des Speicher kümmert, sondern diesen übergeben bekommt, insofern muss (und darf) ein mit Placement new allokierter Pointer nicht mit delete freigegeben werden. Placement new funktioniert mit new und new[]. Auch wichtig ist, das wenn eine Instanz einer C++ Klasse mit Placement new angelegt wird,  man selber für das Aufrufen des Destruktors zuständig ist, da es ja kein delete gibt.
Zu beachten ist, das Placement new in der Syntax nicht eindeutig ist:
char* ap = new char[4];//(1)
int* pi = new (ap) int;//(2)
double* pd = new (std::nothrow) double;//(3)


  1. Ein char array der Größe 4 wird mit new für das Beispiel erstellt
  2. Mit Placement new wird dieser Speicher nun einem int Pointer zugewiesen, im Speicher existiert hier nun ein Integer.
  3. Dies ist kein Placement new, sondern der Aufruf von new mit einem Parameter, welcher new keine std::bad_alloc Exception werfen lässt. Statt dessen gibt er 0 zurück, falls die Allokierung fehlschlägt.

Ein weiterer möglicher Parameter den man new hier übergeben kann, ist ein eine Allokator Klasse, welche entsprechend den operator new (und delete) überladen hat. Der Allokator kümmert sich dann um Allokierung des Speichers. Placement new kann immer dann sehr praktisch sein, wenn ein Programm häufig new aufruft, und dabei viele Objekte der gleichen Größe anlegt und diese auch wieder frei gibt. Dann kann man den Aufwand für die neu Allokierung des Speichers, sowie auch die Freigabe dessen einsparen.