namespace cpp {}

C++ lernen, kennen, anwenden

Benutzer-Werkzeuge

Webseiten-Werkzeuge


kennen:include:new
no way to compare when less than two revisions

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.


kennen:include:new [2012-02-24 15:15] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1
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 von 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki