_set_new_handler
Předá řízení si mechanismus zpracování chyb, pokud new operátor se nepodařilo přidělit paměť.
_PNH _set_new_handler(
_PNH pNewHandler
);
Parametry
- pNewHandler
Ukazatel na zpracování funkce poskytované aplikací paměti.Argument 0 způsobí, že nové obslužné rutiny k odebrání.
Vrácená hodnota
Vrací ukazatel na předchozí výjimky, které jsou registrovány pomocí funkce pro práci s _set_new_handler, takže může být později obnovena 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
C++ _set_new_handler funkce určuje zpracování výjimek funkce, která získá kontrolu, pokud new operátor se nepodařilo přidělit paměť.Pokud new dojde k chybě, spuštění systému automaticky volá funkce zpracování výjimek, která byla předána jako argument pro _set_new_handler._PNH, podle New.h, je ukazatel na funkci, která vrací typ int a přebírá argument typu size_t.Použití size_t Chcete-li určit velikost místa, které mají být přiděleny.
Neexistuje žádný výchozí popisovač.
_set_new_handlerje v podstatě schéma procesu uvolnění paměti.Běhu systému počet opakování přidělení pokaždé, když váš funkce vrátí nenulovou hodnotu a se nezdaří, pokud vaše funkce vrátí 0.
Výskyt _set_new_handler funkce v programu zaregistruje funkci zpracování výjimek uvedených v seznamu argument s běhu 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, které byly předány poslední _set_new_handler funkce a později obnovit:
_PNH old_handler = _set_new_handler( my_handler );
// Code that requires my_handler
_set_new_handler( old_handler )
// Code that requires old_handler
C++ _set_new_mode funkce nastaví nový režim obslužnou rutinu pro malloc.Novou obslužnou rutinu režimu určuje, zda při selhání, malloc je nastavená tak, že volání rutiny ovladače nové _set_new_handler.Ve výchozím nastavení nevolá malloc nové rutiny obsluhy při selhání přidělení paměti.Toto výchozí chování můžete přepsat tak, aby, když selže přidělování paměti modulem malloc volal malloc novou rutinu ovladače stejným způsobem jako operátor new, když ze stejného důvodu selže.Chcete-li přepsat výchozí nastavení, zavolejte:
_set_new_mode(1)
v rané fázi programu nebo propojení s Newmode.obj.
Pokud uživatelem definované operator new je k dispozici nová funkce obslužné rutiny nejsou volána automaticky při selhání.
Další informace naleznete v tématu nové a Odstranit v Referenční příručka jazyka C++.
Je jediný _set_new_handler obslužné rutiny pro všechny spustitelné soubory, nebo knihovny DLL dynamicky propojené i když zavoláte _set_new_handler vaše obslužná rutina může být nahrazena jinou, nebo nahradit ovladač nastavit jiná knihovna DLL nebo spustitelný soubor.
Požadavky
Rutina |
Požadované záhlaví |
---|---|
_set_new_handler |
<New.h> |
Další informace o kompatibilitě naleznete v úvodu tématu Kompatibilita.
Příklad
V tomto příkladu selhání přidělení ří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 znamená, ž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. Pokud chcete volat standardní funkci jazyka C, použijte PInvoke. Další informace naleznete v tématu Příklady vyvolání platformy.