set_new_handler function

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu new.h - Index


Header-Datei

new.h

Kategorie

Speicherroutinen

Syntax

typedef void (new * new_handler)();

new_handler set_new_handler(new_handler my_handler);

Beschreibung

set_new_handler installiert die Funktion, die aufgerufen wird, wenn der globale Operator new oder der operator new[]() den erforderlichen Speicher nicht reservieren kann. Standardmäßig lösen die Operatoren new die Exception bad_alloc aus, wenn kein Speicher reserviert werden kann. Sie können dieses Standardverhalten ändern, indem Sie über einen Aufruf von set_new_handler einen neuen Handler festlegen. Mit set_new_handler(0) bewahren Sie das traditionelle Verhalten des Operators new, bei dem keine Exceptions ausgelöst werden.

Kann new den erforderlichen Speicher nicht zuweisen, ruft der Operator den Handler auf, der mit einem vorherigen Aufruf von set_new_handler festgelegt wurde. Wurde mittels set_new_handler kein neuer Handler installiert, gibt new 0 zurück. my_handler sollte die Aktionen angeben, die eingeleitet werden, wenn new eine Speicheranforderung nicht erfüllen kann. Der in new.h definierte Typ von new_handler ist eine Funktion, die keine Argumente übernimmt und void zurückgibt. new_handler kann die Exception bad_alloc auslösen.

  • Der benutzerdefinierte my_handler sollte eine der folgenden Aktionen ausführen:
  • nach der Freigabe von Speicher zurückkehren
  • die Exception bad_alloc oder eine von ihr abgeleitete Exception auslösen
  • die Funktionen abort oder exit aufrufen

Kehrt die Funktion my_handler zurück, wird new erneut versuchen, die Speicheranforderung zu erfüllen.

Im Idealfall könnte my_handler Speicher freigeben und zurückkehren. Dann könnte new die Speicheranforderung erfüllen und das Programm würde fortgesetzt. Kann my_handler jedoch keinen Speicher für new bereitstellen, muss my_handler eine Exception auslösen oder das Programm beenden. Andernfalls entsteht eine Endlosschleife.

Vorzugsweise sollten Sie den Operator new() und den Operator new[]() überladen, um die für Ihre Anwendungen geeigneten Aktionen auszuführen.

Rückgabewert

set_new_handler gibt den alten Handler zurück, wenn ein solcher registriert wurde.

Die benutzerdefinierte Argumentfunktion my_handler darf keinen Wert zurückgeben.

Beispiel



 #include <iostream>
 #include <new.h>
 #include <stdlib.h>
 using std::cout;
 using std::hex;
 void mem_warn() {
   std::cerr << "\nCan't allocate!";
   exit(1);
 }
 
 void main(void) {
   std::set_new_handler(mem_warn);
   char *ptr = new char[100];
   cout << "\nFirst allocation: ptr = " << hex << long(ptr);
   ptr = new char[64000U];
   cout << "\nFinal allocation: ptr = " << hex << long(ptr);
   std::set_new_handler(0);  // Auf Standard zurücksetzen.
 }