Поделиться через


_CrtSetAllocHook

Устанавливает определяемую клиентом функцию выделения путём её прикрепления в отладочный процесс выделения памяти среды выполнения языка C (только отладочная версия).

_CRT_ALLOC_HOOK _CrtSetAllocHook(
   _CRT_ALLOC_HOOK allocHook 
);

Параметры

  • allocHook
    Новая, определенная клиентом функция выделения прикрепляется в отладочный процесс выделения памяти среды выполнения C.

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

Возвращает ранее определенную функцию-ловушку выделения памяти, или NULL при allocHook равном NULL.

Заметки

_CrtSetAllocHook позволяет приложению прикрепить собственную функцию выделения в процесс выделения памяти в отладочной библиотеке среды выполнения C. В результате каждый вызов функции отладочного выделения для выделения, перераспределения или освобождения блока памяти запускает вызов функции-ловушки приложения. _CrtSetAllocHook предоставляет приложению простой метод для тестирования того, как приложение обрабатывает ситуации недостатка памяти, возможность проверять шаблоны выделения и возможность записывать в журнал данные выделения для дальнейшего анализа. Если _DEBUG не определен, то вызовы _CrtSetAllocHook удаляются во время предварительной обработки.

Функция _CrtSetAllocHook устанавливает новую, определенную клиентом функцию выделения, указанную в allocHook, и возвращает ранее определенную функцию-ловушку. В следующем примере показано, как должна быть объявлена определяемая клиентом функция выделения:

int YourAllocHook( int allocType, void *userData, size_t size, int 
blockType, long requestNumber, const unsigned char *filename, int 
lineNumber);

Аргумент allocType определяет тип операции выделения (_HOOK_ALLOC, _HOOK_REALLOC и _HOOK_FREE), которая запустила вызов функции-ловушки выделения. Если запускаемым типом выделения является _HOOK_FREE, userData является указателем на раздел пользовательских данных блока памяти, который должен быть освобожден. Однако, если запускаемым типом выделения является _HOOK_ALLOC или _HOOK_REALLOC, userData равен NULL, поскольку блок памяти еще не был выделен.

size определяет размер блока памяти в байтах, blockType указывает тип блока памяти, requestNumber является порядковым номером объекта выделения блока памяти, и, если доступны, filename и lineNumber указывают исходное имя файла и номер строки, где был запущен процесс выделения.

После обработки функция-ловушка должна возвращать логическое значение, которое указывает главному процессу выделения среды выполнения C, как продолжить выполнение. Когда функция-ловушка требует, чтобы главный процесс выделения продолжал выполнение, как если бы функция-ловушка не была вызвана, то функция-ловушка должна возвращать TRUE. Это приводит к запуску выполнения оригинальной операции выделения. С помощью этой реализации функция-ловушка может получать и сохранять данные о выделении для дальнейшего анализа, не препятствуя текущей операции выделения или состоянию отладочной кучи.

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

Чтобы удалить функцию-ловушку, передайте NULL в _CrtSetAllocHook.

Дополнительные сведения о том, как _CrtSetAllocHook можно использовать с другими функциями управления памятью или как создавать собственные определенные клиентом функции-ловушки, см. Написание функций отладочных ловушек.

Примечание

_CrtSetAllocHook не поддерживается в /clr:pure.

Требования

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

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

_CrtSetAllocHook

<crtdbg.h>

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

Библиотеки

Только отладочные версии Библиотеки времени выполнения языка C.

Пример

Пример использования _CrtSetAllocHook см. в разделе crt_dbg2.

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

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

См. также

Ссылки

Процедуры отладки

_CrtGetAllocHook