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


Ловушки выделения и выделения памяти 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

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

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