_set_new_handler
Управление переключений в механизм обработки ошибок, если new сбое оператора для выделения памяти.
_PNH _set_new_handler(
_PNH pNewHandler
);
Параметры
- pNewHandler
Указатель на приложение-поставленной памяти при обработке функцию.Аргумент 0 приводит к тому, что новый обработчик необходимо удалить.
Возвращаемое значение
Возвращает указатель на предыдущую функции обработки ошибок зарегистрированной by _set_new_handlerфункция previous, так что можно восстановить более поздней версии.Если функция previous не задана, то возвращаемое значение может использоваться для получения по умолчанию применяются расширения функциональности; это значение может быть NULL.
Заметки
C++ _set_new_handler функция определяет функцию обработки ошибок, если элемент управления увеличений new сбое оператора для выделения памяти.If 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
C++ _set_new_mode функция задает режим обработки для нового malloc.Новый режим ядра, указывающее, является ли при ошибке malloc новая процедура вызова обработчика в виде набора by _set_new_handler.По умолчанию malloc не вызывает новую процедуру обработчика при сбое выделить память.Можно переопределить используемую по умолчанию функциональности, что, когда malloc не удалось выделить память. malloc вызывает новую процедуру обработчика тем же способом, new оператор делает, если он завершается ошибкой для этой же причине.Переопределить значения по умолчанию, вызов.
_set_new_mode(1)
в начале свои программы или связь с Newmode.obj.
Если определенное пользователем operator newпредоставляет новый обработчик функции автоматически не вызываются в случае сбоя.
Дополнительные сведения см. в разделе создать и удалить в Справочник по языку C++.
Одно _set_new_handler обработчик для всех динамически связанные библиотеки DLL или исполняемых файлов; даже если вызвать _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. Дополнительные сведения см. в разделе Примеры вызовов неуправляемого кода.