Ловушки выделения и выделения памяти 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 заменить эту стандартную функцию одной из своих.