Freigeben über


_set_new_handler

Überträgt die Steuerung an new , wenn der Fehlerbehandlungsmechanismus Operator Speicher belegen kann nicht.

_PNH _set_new_handler(
   _PNH pNewHandler 
);

Parameter

  • pNewHandler
    Zeiger auf die von der Anwendung bereitgestellt behandlungs Arbeitsspeicher Funktion.Ein Argument von 0 veranlasst den neuen Handler entfernt werden soll.

Rückgabewert

Gibt einen Zeiger auf die vorherige Ausnahmebehandlung zurück, die von _set_new_handlerregistriert ist, sodass die vorherige Funktion später wiederhergestellt werden kann.Wenn keine vorherige Funktion festgelegt wurde, kann der Rückgabewert verwendet werden, um das Standardverhalten wiederherzustellen. dieser Wert kann NULLsein.

Hinweise

Die Funktion C++ _set_new_handler gibt eine Ausnahmebehandlung Gewinn dass die Steuerung an, ob der Operator Speicher belegen kann nicht new .Wenn new fehlschlägt, ruft das Laufzeitsystem automatisch die Ausnahmebehandlung an, die als Argument an _set_new_handlerübergeben wurde._PNH, definiert in New.h, ist ein Zeiger auf eine Funktion, dass int-Typ zurückgibt und ein Argument des Typs size_takzeptiert.Verwenden Sie size_t , um den zuzuordnenden Stelle anzugeben.

Es gibt keinen Standardhandler.

_set_new_handler ist im Wesentlichen ein Garbage Collections-Schema.Das Laufzeitsystem Zuordnung erneut versucht jedes Mal, wenn die Funktion einen Wert ungleich 0 (null) zurückgibt und ein Fehler auftritt, wenn die Funktion 0 zurück.

Ein Vorkommen der _set_new_handler-Funktion in Registern eines Programms, die die Ausnahmebehandlung in der Argumentliste mit dem Laufzeitsystem angegeben hat:

#include <new.h>
int handle_program_memory_depletion( size_t )
{
   // Your code
}
int main( void )
{
   _set_new_handler( handle_program_memory_depletion );
   int *pi = new int[BIG_NUMBER];
}

Sie können die Funktionsadresse speichern, die zuletzt in die _set_new_handler-Funktion übergeben wurde und später wieder einfügen:

_PNH old_handler = _set_new_handler( my_handler );
   // Code that requires my_handler
   _set_new_handler( old_handler )
   // Code that requires old_handler

Die Funktion C++ _set_new_mode legt den neuen Handler für mallocModus fest.Der neue Modus gibt an, ob die Handler auf Fehler, malloc , die neue Handler routine legen Sie z. B. durch _set_new_handleraufzurufen ist.Standardmäßig ruft malloc nicht die neuen Handler routine bei Bindungsfehlern Speicher belegen.Sie können dieses Standardverhalten überschreiben, dass beim malloc Speicher belegen, kann nicht malloc die neue Handler routine genauso aufgerufen wird, dass der Operator new , wenn sie aus demselben Grund fehlschlägt.Um den Standardwert überschreiben, rufen Sie:

_set_new_mode(1)

früh im Programm oder eine Verknüpfung mit Newmode.obj.

Wenn ein benutzerdefiniertes operator newbereitgestellt wird, werden die neuen Handlerfunktionen nicht automatisch beim Fehler.

Weitere Informationen finden Sie unter neu und Löschen in der C++-Sprachreferenz.

Es wird ein einzelner _set_new_handler-Handler für alle dynamisch verknüpfte DLL oder ausführbare Dateien. Auch wenn Sie _set_new_handler aufrufen, wird der Handler durch andere ersetzt oder das ersetzen Sie einen Handler, der durch eine andere DLL oder ausführbare Datei festgelegt ist.

Anforderungen

Routine

Erforderlicher Header

_set_new_handler

<new.h>

Weitere Informationen finden Sie unter Kompatibilität Kompatibilität in der Einführung.

Beispiel

In diesem Beispiel wenn die Belegung fehlschlägt, wird die Steuerung an MyNewHandler übertragen.Das Argument, das an MyNewHandler übergeben wird, ist die Anzahl der angeforderten Bytes sein.Der Wert, der aus MyNewHandler zurückgegeben wird, ist ein Flag, ob Zuordnung erneut versucht werden soll: Ein Wert ungleich 0 (null) gibt an, dass die Zuordnung erneut versucht werden soll, der Wert 0 gibt an, dass Speicherbelegung fehlgeschlagen ist.

// crt_set_new_handler.cpp
// compile with: /c
#include <stdio.h>
#include <new.h>
#define BIG_NUMBER 0x1fffffff

int coalesced = 0;

int CoalesceHeap()
{
   coalesced = 1;  // Flag RecurseAlloc to stop 
   // do some work to free memory
   return 0;
}
// Define a function to be called if new fails to allocate memory.
int MyNewHandler( size_t size )
{
   printf("Allocation failed. Coalescing heap.\n");

   // Call a function to recover some heap space.
   return CoalesceHeap();
}

int RecurseAlloc() {
   int *pi = new int[BIG_NUMBER];
   if (!coalesced)
      RecurseAlloc();
   return 0;
}

int main()
{
   // Set the failure handler for new to be MyNewHandler.
   _set_new_handler( MyNewHandler );
   RecurseAlloc();
}
  
  
  
  

.NET Framework-Entsprechung

Nicht zutreffend. Um die Standard-C-Funktion aufrufen, verwenden Sie PInvoke. Weitere Informationen finden Sie unter Plattformaufruf-Beispiele.

Siehe auch

Referenz

Speicherbelegung

calloc

Frei

realloc