Udostępnij za pośrednictwem


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

Zobacz też

Informacje

Alokacja pamięci

calloc

free

odśmiecacz