_set_new_handler
Przekazuje kontrolę do mechanizmu obsługi błędów, jeśli operator new nie może przydzielić pamięci.
_PNH _set_new_handler(
_PNH pNewHandler
);
Parametry
- pNewHandler
Wskaźnik do obsługi funkcji pamięci dostarczone przez aplikację.Argument 0 powoduje, że nowy program obsługi ma zostać usunięty.
Wartość zwracana
Zwraca wskaźnik do poprzedniego wyjątku obsługi funkcji zarejestrowane przez _set_new_handler, dzięki czemu może później przywrócić poprzedniego funkcję.Jeśli nie ustawiono żadnych poprzednich funkcji, zwracana wartość można przywrócić domyślne zachowanie; Wartość ta może być NULL.
Uwagi
C++ _set_new_handler funkcja określa funkcję obsługi wyjątków, który przejmuje kontrolę, jeśli new operatora nie można przydzielić pamięci.Jeśli new się nie powiedzie, system wykonawczy automatycznie wywołuje funkcję obsługi wyjątków, przekazany jako argument do _set_new_handler._PNH, zdefiniowana w New.h, jest wskaźnik do funkcji, która zwraca typ int i przyjmuje argument typu size_t.Użycie size_t Aby określić ilość miejsca, które mają zostać przyznane.
Nie ma żadnych domyślnym programem obsługi.
_set_new_handlerjest to zasadniczo system wyrzucania elementów bezużytecznych.System wykonywania prób alokacji każdorazowo funkcja zwraca wartość różną od zera i nie działa, jeśli funkcja zwraca wartość 0.
Wystąpienie _set_new_handler funkcja w programie rejestruje funkcję obsługi wyjątków określonych w liście argumentów z działającego systemu:
#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];
}
Można zapisać adresu funkcji, który ostatnio został przekazany do _set_new_handler funkcjonować i przywrócenie go później:
_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 funkcja Ustawia nowy tryb obsługi dla malloc.Nowy tryb obsługi wskazuje, czy w przypadku awarii, malloc jest wywołanie nowej procedury obsługi zgodnie z ustawieniem _set_new_handler.Domyślnie malloc nie wywołuje nowej procedury obsługi awarii w celu przydzielenia pamięci.Możesz zastąpić to zachowanie domyślne, aby, kiedy malloc nie będzie w stanie przydzielić pamięci, malloc wywoła nową procedurę obsługi w taki sam sposób, jak robi to operator new, gdy ma awarię z tego samego powodu.Aby zastąpić ustawienia domyślne, należy wywołać:
_set_new_mode(1)
wczesnym etapie programu lub łącze z Newmode.obj.
Jeśli zdefiniowane przez użytkownika operator new jest podana, nowe funkcje obsługi nie są automatycznie nazywane w przypadku awarii.
Aby uzyskać więcej informacji, zobacz Nowy i usunąć w Skorowidz języka C++.
Istnieje tylko jedno _set_new_handler obsługi dla wszystkich dynamicznie połączonej biblioteki DLL lub pliki wykonywalne; nawet jeśli zadzwonisz _set_new_handler program obsługi może być zastąpione innym lub zastępowanych przez innego pliku DLL lub wykonywalnego program obsługi.
Wymagania
Procedura |
Wymagany nagłówek |
---|---|
_set_new_handler |
<New.h> |
Aby uzyskać więcej informacji na temat zgodności, zobacz Zgodność we Wstępie.
Przykład
W tym przykładzie gdy alokacja nie powiedzie się, kontrola zostaje przeniesiony do MyNewHandler.Argument przekazany do MyNewHandler jest liczba bajtów.Flaga wskazująca, czy powinna być ponowiona alokacji jest wartość zwracana z MyNewHandler: wartość różną od zera wskazuje, że powinno być ponowione alokacji i wartość zero oznacza, że alokacja nie powiodła się.
// 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();
}
Odpowiednik w programie .NET Framework
Nie dotyczy. Aby wywołać standardową funkcję C, należy użyć PInvoke. Aby uzyskać więcej informacji, zobacz Przykłady wywoływania platformy.