Функции создания отчетов о состоянии кучи
Этот раздел применим к:
Выпуск |
Visual Basic |
C# |
F# |
C++ |
Web Developer |
---|---|---|---|---|---|
Express |
Только машинные коды |
||||
Pro, Premium и Ultimate |
Только машинные коды |
Есть несколько функций, отчитывающихся о содержимом отладочной кучи на текущий момент.
_CrtMemState
Чтобы сохранить снимок состояния кучи на текущий момент, используется структура _CrtMemState, определенная в CRTDBG.H:
typedef struct _CrtMemState
{
// Pointer to the most recently allocated block:
struct _CrtMemBlockHeader * pBlockHeader;
// A counter for each of the 5 types of block:
size_t lCounts[_MAX_BLOCKS];
// Total bytes allocated in each block type:
size_t lSizes[_MAX_BLOCKS];
// The most bytes allocated at a time up to now:
size_t lHighWaterCount;
// The total bytes allocated at present:
size_t lTotalCount;
} _CrtMemState;
Эта структура сохраняет указатель на первый (выделенный последним) блок в связанном списке отладочной кучи. Затем в двух массивах она записывает, сколько блоков памяти каждого типа (_NORMAL_BLOCK, _CLIENT_BLOCK, _FREE_BLOCK и т. д.) имеется в списке, а также количество байтов, выделенных в блоке каждого типа. И наконец она записывает наибольшее количество байтов, выделенных в куче до настоящего времени, а также количество байтов, выделенных в данный момент.
Другие функции отчетов CRT
Эти функции отчитываются о состоянии и содержимом кучи, использование этих сведений помогает обнаружить утечки памяти и решить другие подобные проблемы.
Функция |
Описание |
---|---|
Сохраняет снимок кучи в структуре _CrtMemState приложения. |
|
Сравнивает две структуры состояния памяти, сохраняет в третьей структуре различие между ними и возвращает значение TRUE при нахождении различий. |
|
Формирует дамп структуры _CrtMemState. Структура может содержать снимок состояния отладочной кучи на данный момент или различие между двумя состояниями. |
|
Выводит сведения обо всех объектах, выделенных с момента получения данного снимка кучи или с начала выполнения. Каждый раз при выводе блока _CLIENT_BLOCK вызывается функция-ловушка приложения, если она была установлена с помощью _CrtSetDumpClient. |
|
Определяет, не произошла ли утечка памяти с начала выполнения программы, и, если произошла, выводит все выделенные объекты. Каждый раз при выводе блока _CLIENT_BLOCK при помощи _CrtDumpMemoryLeaks вызывается функция-ловушка приложения, если она была установлена с помощью _CrtSetDumpClient. |