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


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

Очень важное условие для функций-ловушек выделения — то, что они не должны явно обрабатывать блоки _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 Sample