_set_new_handler
Przekazuje sterowanie do programu mechanizmu obsługi błędów, jeśli new operatora nie można przydzielić pamięci.
_PNH _set_new_handler(
_PNH pNewHandler
);
Parametry
- pNewHandler
Wskaźnik do obsługi funkcji pamięci dostarczonych przez aplikację.Argument 0 powoduje, że nowy program obsługi ma zostać usunięty.
Wartość zwracana
Zwraca wskaźnik do obsługi funkcji zarejestrowanych przez wyjątków poprzedniej _set_new_handler, dzięki czemu można później przywrócone poprzednie funkcji.Jeśli nie ustawiono żadnej funkcji poprzednich, zwracana wartość może służyć do przywrócić domyślne zachowanie; wartość ta może być NULL.
Uwagi
C++ _set_new_handler funkcji określa funkcję obsługi wyjątków, który przejmuje kontrolę, jeżeli new operatora nie można przydzielić pamięci.Jeśli new nie powiedzie się, system run-time automatycznie wywołuje funkcję obsługi wyjątków, który został przekazany jako argument do _set_new_handler._PNH, zdefiniowana w New.h, jest wskaźnik do funkcji, która zwraca wartość typu int i przyjmuje argument typu size_t.Użyj size_t , aby określić ilość miejsca, które mają zostać przydzielone.
Nie ma żadnych domyślnym programem obsługi.
_set_new_handlerjest to zasadniczo system wyrzucania elementów bezużytecznych.System run-time ponownych prób alokacji przy każdym funkcja zwraca wartość różną od zera i kończy się niepowodzeniem, jeśli funkcja zwraca wartość 0.
Wystąpienie _set_new_handler funkcji w programie rejestruje funkcję obsługi wyjątków określonych na liście argumentów w systemie run-time:
#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ć adres funkcji, który ostatnio został przekazany do _set_new_handler funkcję i przywrócić 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 procedury obsługi nowych określone przez _set_new_handler.Domyślnie malloc nie wywołuje nowe procedury obsługi na nie można przydzielić pamięci.Można zastąpić to zachowanie domyślne tak, aby, gdy malloc nie można przydzielić pamięci, malloc wywołuje nowe procedury obsługi w taki sam sposób new operator wykonuje, gdy go nie powiedzie się z tego samego powodu.Aby zastąpić ustawienia domyślne, należy wywołać:
_set_new_mode(1)
we wczesnej fazie programu lub łącze z Newmode.obj.
Jeśli przez użytkownika operator newjest 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 nasza procedura obsługi może być zastąpione innym lub zastąpienia przez inną bibliotekę DLL lub plik wykonywalny program obsługi.
Wymagania
Rozpoczęto wykonywanie procedury |
Wymaganego nagłówka |
---|---|
_set_new_handler |
<new.h> |
Informacji dotyczących zgodności, zobacz zgodności we wprowadzeniu.
Przykład
W tym przykładzie gdy alokacja nie powiedzie się, formant jest przenoszona do MyNewHandler.Argument przekazany do MyNewHandler jest liczba bajtów.Wartość zwracana z MyNewHandler stanowi flagę wskazującą, czy przydział powinno być ponowione: wartość różną od zera oznacza, że powinno być ponowione alokacji i wartość zero wskazuje alokacji nie powiodło 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ć standardowych funkcji C, należy użyć PInvoke. Aby uzyskać więcej informacji, zobacz Przykłady wywołać platformy.