Шаг 33 - Управление памятью и Динамическая память Отладки

Две из наиболее общих и тяжелых проблем, с которыми сталкиваются программисты - это запись дальше конца распределенного буфера и не удаление распределенной памяти. Динамическая память отладки обеспечивает мощные инструментальные средства, чтобы решить проблемы распределения памяти этого вида.

Отладочные версии обращений к функции динамической памяти отличаются от основных версий, используемых в конечных выпусках. Когда Вы запрашиваете блок памяти, программа управления динамической областью отладки распределяет от основной динамической памяти немного больше памяти чем требуется и возвращает указатель на вашу часть того блока. Например, предположите, что ваша прикладная программа содержит запрос: malloc (10). В конечном выпуске malloc вызвал бы основную подпрограмму распределения динамической памяти, требующую распределение 10 байт. В отладочной версии, однако, malloc вызвал бы _malloc_dbg, который вызовет основную подпрограмму распределения динамической памяти, требующую распределение 10 байтов плюс приблизительно c 36 байтами дополнительной памяти. Все блоки памяти в динамической памяти отладки связаны в отдельном списке связей, упорядочены согласно тому, когда они были распределены.

Дополнительная память, распределенная подпрограммами динамической памяти отладки используется для отладочной информации, для указателей, которые связывают блоки памяти отладки вместе, и для маленьких буферов с обеих сторон ваших данных, чтобы захватить наложения записей распределенной области.

В настоящее время эта таблица распределенной памяти представлена в виде набора структур.

typedef struct _CrtMemBlockHeader
{
// Указатель на ранее распределнный блок:
	struct _CrtMemBlockHeader *pBlockHeaderNext; 

// Указатель на следующий распределенный блок:
	struct _CrtMemBlockHeader *pBlockHeaderPrev; 
	char *szFileName;		// имя файла
	int nLine;		// номер линии
	size_t nDataSize;		// размер блока
	int nBlockUse;		// тип блока
	long lRequest;		// номер распределения

// буфер между использованной памятью
	unsigned char gap[nNoMansLandSize];  
} _CrtMemBlockHeader;

Буфера с обеих сторон области данных пользователя блока - в настоящее время 4 байта в размере, и заполнены известным значением байта, используемым подпрограммами динамической памяти отладки, чтобы проверить, что пределы блока памяти пользователя не были записаны поверх. Динамическая память отладки также заполняет новые блоки памяти известным значением. Если Вы выбираете сохранять освобожденные блоки в списке связей динамической памяти как объяснено ниже, эти освобожденные блоки также заполнены известным значением. В настоящее время, фактические используемые значения байта следующие:

NoMansLand (0xFD)

Этим значением заполнятся буфера между распределенной памятью с обоих сторон.

Freed blocks (0xDD)

Этим значением заполнятся свободные места в памяти:

New objects (0xCD)

Этим значением заполнятся новые участки памяти.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 23.08.2000