Функции-ловушки выделения
Обновлен: Ноябрь 2007
Этот раздел применим к:
Выпуск |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Экспресс-выпуск |
Только машинные коды |
|||
Standard |
Только машинные коды |
|||
Pro и Team |
Только машинные коды |
Обозначения:
Применяется |
|
Неприменимо |
|
Команда или команды скрытые по умолчанию. |
Функции-ловушки выделения, установленные с помощью _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_dbg2: отладочные функции-ловушки для среды выполнения C
Основные понятия
Ловушки выделения и выделения памяти CRT