_set_new_handler

Передает управление в механизм обработки ошибок, если оператор new не смог выделить память.

_PNH _set_new_handler(
   _PNH pNewHandler 
);

Параметры

  • pNewHandler
    Указатель на предоставленную приложением функцию обработки памяти. Аргумент 0 вызывает удаление нового обработчика.

Возвращаемое значение

Возвращает указатель на предыдущую функцию обработки исключений, зарегистрированную _set_new_handler, чтобы предыдущую функцию можно было впоследствии восстановить. Если предыдущая функция не задана, то возвращаемое значение может использоваться для восстановления поведения по умолчанию; это значение может быть равно NULL.

Заметки

Функция C++ _set_new_handler определяет функцию обработки исключений, которая получает управление, если new не смогла выделить память. Если new завершается ошибкой, система времени выполнения автоматически вызывает функцию обработки исключений, которая была передана в качестве аргумента _set_new_handler. _PNH, определенный в New.h, представляет собой указатель на функцию, которая возвращает тип int и принимает аргумент типа size_t. Используйте size_t для определения объема выделяемого пространства.

Обработчик по умолчанию отсутствует.

_set_new_handler фактически является схемой сборки мусора. Система времени выполнения делает попытку выделения памяти каждый раз, когда пользовательская функция возвращает ненулевое значение, и завершается неудачей, если пользовательская функция возвращает 0.

Появление функции _set_new_handler в программе регистрирует в системе времени выполнения функцию обработчика исключения, указанную в списке аргументов:

#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];
}

Можно сохранить адрес функции, который был передан последним в функцию _set_new_handler, и восстановить его позже:

_PNH old_handler = _set_new_handler( my_handler );
   // Code that requires my_handler
   _set_new_handler( old_handler )
   // Code that requires old_handler

Функция _set_new_mode C++ задает новый режим обработчика для malloc. Указывает, может ли новый режим обработки, при сбое вызова malloc при сбое вызывать новую процедуру обработчика как набор _set_new_handler. По умолчанию malloc не вызывает новую процедуру обработчика при сбое выделения памяти. Можно переопределить это поведение по умолчанию, чтобы в случае сбоя предоставления памяти методом malloc метод malloc вызывал новую процедуру обработчика таким же образом, как это делает оператор new при сбое по той же причине. Чтобы переопределить значение по умолчанию, вызовите:

_set_new_mode(1)

на ранних этапах программы или компонуйте с использованием Newmode.obj.

Если предоставлен определенный пользователем operator new, новые функции обработчика не вызываются автоматически при сбое.

Дополнительные сведения см. в разделе new и delete в Справочнике по языку C++.

Для всех динамически связываемых DLL и исполняемых файлов определен один обработчик _set_new_handler; даже при вызове _set_new_handler ваш обработчик может быть заменен другим или вы можете непроизвольно заменить обработчик, установленный другой DLL или другим исполняемым файлом.

Требования

Подпрограмма

Обязательный заголовок

_set_new_handler

<new.h>

Дополнительные сведения о совместимости см. в разделе Совместимость во введении.

Пример

Если в этом примере выделение памяти завершается сбоем, управление передается обработчику MyNewHandler. Аргумент, переданный MyNewHandler, представляет собой запрошенное количество байтов. Значение, возвращаемое из MyNewHandler, представляет собой флаг, указывающий, нужна ли повторная попытка выделения памяти: ненулевое значение указывает, что выделение должно быть повторено, а нулевое значение указывает, что произошла ошибка выделения памяти.

// 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();
}
       

Эквивалент в .NET Framework

Неприменимо. Для вызова стандартной функции C используйте PInvoke. Дополнительные сведения см. в разделе Примеры вызовов неуправляемого кода.

См. также

Ссылки

Выделение памяти

calloc

свободные

realloc