_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. Параметры компилятора /clr:pure и /clr:safe компилятора устарели в Visual Studio 2015 и удалены в Visual Studio 2017.
Требования
Маршрут | Обязательный заголовок |
---|---|
_CrtSetAllocHook |
<crtdbg.h> |
Дополнительные сведения о совместимости см. в разделе Совместимость.
Библиотеки
Только отладочные версии библиотек времени выполнения языка C.
Пример
Пример использования _CrtSetAllocHook
см. в разделе crt_dbg2
.