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


Функции-ловушки выделения

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

Примечание

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

Функция-ловушка выделения должна иметь следующий прототип:

int YourAllocHook(int nAllocType, void *pvData,
        size_t nSize, int nBlockUse, long lRequest,
        const unsigned char * szFileName, int nLine )

Указатель, который передается _CrtSetAllocHook, имеет тип _CRT_ALLOC_HOOK, как определено в CRTDBG.H:

typedef int (__cdecl * _CRT_ALLOC_HOOK)
    (int, void *, size_t, int, long, const unsigned char *, int);

Когда библиотека CRT вызывает ловушку, аргумент nAllocType показывает, какого вида операция выделения будет выполнена (_HOOK_ALLOC, _HOOK_REALLOC или _HOOK_FREE). В случае освобождения или перераспределения, pvData содержит указатель на пользовательскую часть освобождаемого блока. Однако в случае выделения памяти этот указатель пуст, так как выделение еще не произошло. Остальные аргументы содержат размер запрашиваемого выделения, его тип блока, номер последующего запроса, связанный с выделением запроса, и указатель на имя файла и номер строки, в которой было сделано выделение (если доступно). После того как функция-ловушка выполнит анализ и другие запрограммированные автором действия, она должна вернуть или значение TRUE, означающее, что операция выделения может продолжаться, или значение FALSE в случае предполагаемого сбоя операции. Простая ловушка этого типа может проверить количество выделенной до настоящего момента памяти и вернуть FALSE в случае превышения лимита. В таком случае в приложении могут возникать ошибки выделения памяти, которые обычно возникают только при большой нехватке доступной памяти. Более сложные ловушки могут отслеживать структуру выделения, анализировать использование памяти или сообщать о возникновении какой-либо определенной ситуации.

См. также

Основные понятия

Ловушки выделения и выделения памяти CRT

Другие ресурсы

Написание функций отладочных ловушек

crt_dbg2 Sample