Типы блоков в куче отладки
Обновлен: Ноябрь 2007
Этот раздел применим к:
Выпуск |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Экспресс-выпуск |
Только машинные коды |
|||
Standard |
Только машинные коды |
|||
Pro и Team |
Только машинные коды |
Обозначения:
Применяется |
|
Неприменимо |
|
Команда или команды скрытые по умолчанию. |
Каждому блоку памяти в отладочной куче присвоен один из пяти типов выделений памяти. Эти типы отслеживаются и по-разному фиксируются в отчетах в зависимости от целей: обнаружение утечки памяти или отчет о состоянии. Тип блока можно задать, выделив его с помощью непосредственного вызова одной из функций выделения отладочной кучи, например _malloc_dbg. Пять типов блоков памяти в отладочной куче (задаются в nBlockUse — члене структуры _CrtMemBlockHeader) следующие:
_NORMAL_BLOCK
Вызов malloc или calloc создает обычный блок. Если планируется использование только обычных блоков и не требуются клиентские, можно определить _CRTDBG_MAP_ALLOC, которая преобразует все вызовы выделений кучи в их отладочные эквиваленты в отладочном построении. Такой подход позволяет хранить сведения об имени файла и номере строки для каждого выделения в заголовке соответствующего блока._CRT_BLOCK
Блоки памяти, выделенные для внутреннего использования несколькими функциями библиотеки CRT, помечаются как CRT-блоки и могут обрабатываться отдельно. В результате для обнаружения утечки и других операций эти блоки несущественны. Выделение памяти никогда не работает с блоками типа CRT (не выделяет, не перераспределяет и не освобождает)._CLIENT_BLOCK
В целях отладки приложение может специально отслеживать данную группу выделений путем выделения их как блоков памяти этого типа, применяя явные вызовы функций отладочной кучи. MFC, например, выделяет все CObjects как клиентские блоки; другие приложения могут в клиентских блоках хранить другие объекты памяти. Можно также задавать подтипы клиентских блоков — для более глубокого контроля. Чтобы задать подтип клиентского блока, сдвиньте номер влево на 16 бит и примените для него операцию OR с _CLIENT_BLOCK. Пример.#define MYSUBTYPE 4 freedbg(pbData, _CLIENT_BLOCK|(MYSUBTYPE<<16));
Клиентская функция-ловушка для дампа объекта, хранящегося в клиентском блоке, может быть установлена с помощью _CrtSetDumpClient и потом вызываться всякий раз, когда отладочной функцией создается дамп клиентского блока. Для вызова этой же функции, предоставляемой приложением для каждого клиентского блока в отладочной куче также может применяться _CrtDoForAllClientObjects.
_FREE_BLOCK
Обычно это блоки, которые освобождаются и удаляются из списка. Чтобы удостовериться, что в освобожденную память не продолжается запись, или чтобы эмулировать условия нехватки памяти, можно выбрать хранение освобожденных блоков в связанном списке, помеченных как свободные и заполненных фиксированным значением байта (на данный момент 0xDD)._IGNORE_BLOCK
Операции отладочной кучи можно на время отключить. В течение этого времени блоки памяти хранятся в списке, но помечаются как пропускаемые блоки.
Чтобы определить тип и подтип данного блока, используются функция _CrtReportBlockType и макросы _BLOCK_TYPE и _BLOCK_SUBTYPE. Макросы определяются (в crtdbg.h) следующим образом:
#define _BLOCK_TYPE(block) (block & 0xFFFF)
#define _BLOCK_SUBTYPE(block) (block >> 16 & 0xFFFF)