Inhaltsverzeichnis
<new>
Dynamische Speicherverwaltung
class bad_alloc; extern const struct nothrow_t nothrow; typedef void (*new_handler)();
Eine dynamische Speicheranforderung kann scheitern.
Dann wird eine std::bad_alloc
-Ausnahme geworfen.
Statt Ausnahmen zu werfen, kann ein new_handler
installiert werden. Dieser wird dann aufgerufen, wenn die Speicheranforderung scheitert.
Mit der Kennzeichnung nothrow
wird keine Ausnahme geworfen.
Falls die Speicheranforderung scheitert,
wird ein null_ptr
-Zeiger geliefert.
Deshalb muss man selbst den Zeiger auf Gültigkeit prüfen:
p = new(nothrow) int[1000]; if (p) { // ... // Objekte nutzen } delete [] p;
Wenn Rohspeicher vorhanden ist,
können Objekte mit der Plazierungssyntax auch dort angelegt werden.
Damit ist es möglich, eine eigene Speicherverwaltung aufzubauen.
Allerdings darf der Zeiger dann nicht an den Heap zurückgegeben werden.
Der Destruktor ist explizit aufzurufen,
der zugeordnete Plazierungsoperator delete
kann nur als Funktion aufgerufen werden:
char rohspeicher[sizeof(Klasse)]; p = new(rohspeicher) Klasse; // ... // Objekt nutzen p->~Klasse(); // Destruktor operator delete(p, rohspeicher);
Die Container verstecken diese unhandliche Technik hinter einer allgemein nutzbaren Schnittstelle.
Funktionen
new_handler set_new_handler(new_handler handler)
Beschreibung: Hinterlegt einen Verweis auf die Funktion, die aufzurufen ist, wenn kein Speicher reserviert werden kann.