namespace cpp

C++ lernen, kennen, anwenden

Benutzer-Werkzeuge

Webseiten-Werkzeuge


kennen:include:new

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

kennen:include:new [2012-02-24 15:15] (aktuell)
Zeile 1: Zeile 1:
 +====== <new> ======
 +===== Dynamische Speicherverwaltung =====
 +<code cpp>
 +class bad_alloc;
 +extern const struct nothrow_t nothrow;
 +typedef void (*new_handler)();​
 +</​code>​
 +Eine [[..:​operator#​einstellig|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:
 +
 +<code cpp>
 +p = new(nothrow) int[1000];
 +if (p)
 +{
 +  // ...      // Objekte nutzen
 +}
 +delete [] p;
 +</​code>​
 +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:
 +
 +<code cpp>
 +char rohspeicher[sizeof(Klasse)];​
 +p = new(rohspeicher) Klasse;
 +// ...        // Objekt nutzen
 +p->​~Klasse();​ // Destruktor
 +operator delete(p, rohspeicher); ​
 +</​code>​
 +Die [[..:​stl#​Container]] ​
 +verstecken diese unhandliche Technik hinter einer allgemein nutzbaren Schnittstelle.
 +
 +===== Funktionen =====
 +<code cpp>
 +new_handler set_new_handler(new_handler handler) ​
 +</​code>​
 +[[..:​lib:​set_new_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)