Sdílet prostřednictvím


_set_new_handler

Předá řízení vašeho mechanismus zpracování chyb, pokud new operátor selhání přidělení paměti.

_PNH _set_new_handler(
   _PNH pNewHandler 
);

Parametry

  • pNewHandler
    Ukazatel na zpracování funkce poskytované aplikací paměti.Argument 0 způsobí, že nové odebírané obslužné rutiny.

Vrácená hodnota

Vrací ukazatel na zpracování funkce registrovaných předchozí výjimek _set_new_handler, který lze později obnovit předchozí funkce.Pokud byla nastavena žádná předchozí funkce, vrácenou hodnotu lze obnovit výchozí chování; Tato hodnota může být NULL.

Poznámky

Jazyce C++ _set_new_handler funkce určuje funkce zpracování výjimek, který získá kontrolu, pokud new operátor selhání přidělení paměti.Pokud new selže, běhu systému automaticky vyvolá funkci zpracování výjimek, jako argument předaný _set_new_handler._PNH, definovaná v New.h, je ukazatel na funkci, která vrací typ int a argument typu size_t.Použití size_t Určuje velikost místa, které mají být přiděleny.

Neexistuje žádná výchozí popisovač.

_set_new_handlerje v podstatě schéma úklid.Spuštění systému opakované přidělení při každém funkce vrátí nenulovou hodnotu a dojde k selhání funkce vrátí hodnotu 0.

Výskyt _set_new_handler funkce v programu zaregistruje funkci zpracování výjimek v seznamu argumentů spuštění systému:

#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];
}

Můžete uložit adresu funkce, poslední předaný _set_new_handler funkci a později jej obnovit:

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

Jazyce C++ _set_new_mode funkce nastaví nový režim obslužnou rutinu pro malloc.Nový režim zpracování označuje, zda při selhání, malloc k volání rutiny nové nastaveném _set_new_handler.Ve výchozím nastavení malloc nemůže volat nové rutiny při selhání přidělení paměti.Toto výchozí chování můžete změnit tak, aby, když malloc selhání přidělení paměti, malloc volání rutiny nové stejným způsobem, že new operátor nemá selže z téhož důvodu.Chcete-li přepsat výchozí nastavení volání:

_set_new_mode(1)

v programu nebo propojení s Newmode.obj.

Pokud uživatelem definované operator newje k dispozici nové funkce zpracování není automaticky volána při selhání.

Další informace naleznete v tématu nové a Odstranit v C++ jazyková Reference.

Existuje jeden _set_new_handler obslužnou rutinu pro všechny dynamicky propojené soubory DLL nebo spustitelné soubory; i v případě, že při volání _set_new_handler váš popisovač může být nahrazeno jiným nebo nahrazujete popisovač nastavit jiný DLL nebo spustitelný soubor.

Požadavky

Rutina

Požadované záhlaví

_set_new_handler

<new.h>

Další informace o kompatibilitě v tématu Compatibility v úvodu.

Příklad

Například při selhání přiřazení řízení se převede do MyNewHandler.Argument předaný do MyNewHandler je počet bajtů.Hodnota vrácená z MyNewHandler je příznak označující, zda by měla být zopakována přidělení: Nenulová hodnota znamená, že by měla být zopakována přidělení a nulová hodnota označuje, že se nezdařilo přidělení.

// 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();
}
  
  
  
  

Ekvivalent v rozhraní .NET Framework

Nelze použít Použijte volání funkce standardní C, PInvoke. Další informace naleznete v tématu Příklady vyvolat platformu.

Viz také

Referenční dokumentace

Přidělení paměti

calloc

free

realloc