Ловушки выделения и выделения памяти CRT
Обновлен: Ноябрь 2007
Этот раздел применим к:
Выпуск |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Экспресс-выпуск |
Только машинные коды |
|||
Standard |
Только машинные коды |
|||
Pro и Team |
Только машинные коды |
Обозначения:
Применяется |
|
Неприменимо |
|
Команда или команды скрытые по умолчанию. |
Очень важное условие для функций-ловушек выделения — то, что они не должны явно обрабатывать блоки _CRT_BLOCK (выделения памяти, сделанные внутри библиотеки CRT ее функциями) при любом вызове функций CRT, выделяющих внутреннюю память. Блоки _CRT_BLOCK можно исключить из обработки путем добавления в начало функции-ловушки выделения следующего кода:
if ( nBlockUse == _CRT_BLOCK )
return( TRUE );
Если ловушка обрабатывает блоки _CRT_BLOCK, то любая вызываемая в ней функция CRT может привести к выполнению в программе бесконечного цикла. Например, printf осуществляет внутреннее выделение. Если код ловушки вызывает printf, получающееся выделение приведет к повторному вызову ловушки, где снова будет вызван printf, и так далее до переполнения стека. Если нужен отчет об операциях выделения _CRT_BLOCK, есть способ обойти это ограничение — для форматирования и вывода использовать функции Windows API вместо функций CRT. Поскольку функции Windows API не используют кучу библиотеки CRT, они не могут привести к выполнению в приложении бесконечного цикла.
Если посмотреть на исходные CRT-файлы, то можно увидеть, что стандартная функция-ловушка выделения CrtDefaultAllocHook, (возвращающая просто TRUE), находится в собственном отдельном файле DBGHOOK.C. Если нужно, чтобы ловушка выделения вызывалась даже для выделений, сделанных в коде запуска CRT, выполняющемся перед функцией приложения main, то можно вместо использования _CrtSetAllocHook заменить эту стандартную функцию одной из своих.
См. также
Задачи
Образец crt_dbg2: отладочные функции-ловушки для среды выполнения C