_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. Дополнительные сведения см. в разделе Примеры вызовов неуправляемого кода.