namespace cpp

C++ lernen, kennen, anwenden

Benutzer-Werkzeuge

Webseiten-Werkzeuge


kennen:include:new

<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.

kennen/include/new.txt · Zuletzt geändert: 2012-02-24 15:15 (Externe Bearbeitung)