_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.