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


Структура CMemoryState

Предоставляет удобный способ обнаружения утечки памяти в программе.

Синтаксис

struct CMemoryState

Участники

Открытые конструкторы

Имя Описание
CMemoryState::CMemoryState Создает структуру класса, которая управляет контрольными точками памяти.

Открытые методы

Имя Описание
CMemoryState::Контрольная точка Получает моментальный снимок (контрольная точка) текущего состояния памяти.
CMemoryState::D ifference Вычисляет разницу между двумя объектами типа CMemoryState.
CMemoryState::D umpAllObjectsSince Дампает сводку по всем выделенным объектам после предыдущей контрольной точки.
CMemoryState::D umpStatistics Выводит статистику выделения памяти для CMemoryState объекта.

Замечания

CMemoryState является структурой и не имеет базового класса.

"Утечка памяти" возникает, когда память для объекта выделяется в куче, но не освобождается, когда она больше не требуется. Такие утечки памяти в конечном итоге могут привести к ошибкам вне памяти. В программе существует несколько способов выделения и освобождения памяти:

  • malloc/ free Использование семейства функций из библиотеки времени выполнения.

  • Использование функций LocalAlloc/ LocalFree управления памятью API Windows и .GlobalAlloc/ GlobalFree

  • Использование C++ new и delete операторов.

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

Как и в других диагностика, CMemoryState диагностика доступны только в отладочных версиях программы. В отладочной версии должна быть определена константа _DEBUG.

Если вы подозреваете, что у вашей программы утечка памяти, можно использовать CheckpointDifferenceфункцию и DumpStatistics функции, чтобы обнаружить разницу между состоянием памяти (объектами, выделенными) в двух разных точках выполнения программы. Эти сведения могут быть полезны при определении того, очищает ли функция все выделенные объекты.

Если просто знать, где происходит дисбаланс в распределении и размещении сделки, не предоставляет достаточно информации, можно использовать DumpAllObjectsSince функцию для дампа всех объектов, выделенных с момента предыдущего вызова Checkpoint. Этот дамп показывает порядок выделения, исходный файл и строку, в которой был выделен объект (если вы используете DEBUG_NEW для выделения), а также производный объект, его адрес и его размер. DumpAllObjectsSince также вызывает функцию каждого объекта Dump для предоставления сведений о текущем состоянии.

Дополнительные сведения об использовании CMemoryState и других диагностика см. в разделе "Отладка приложений MFC".

Примечание.

Объявления объектов типа CMemoryState и вызовов функций-членов должны быть заключены в скобки директивами #if defined(_DEBUG)/#endif . Это приводит к тому, что память диагностика включаться только в сборки отладки программы.

Иерархия наследования

CMemoryState

Требования

Заголовок: afx.h

CMemoryState::Контрольная точка

Принимает сводку моментального снимка памяти и сохраняет ее в этом CMemoryState объекте.

void Checkpoint();

Замечания

Функции-члены CMemoryState Difference и DumpAllObjectsSince используют эти данные моментального снимка.

Пример

См. пример конструктора CMemoryState .

CMemoryState::CMemoryState

Создает пустой CMemoryState объект, который должен быть заполнен функцией "Контрольная точка" или "Разница ".

CMemoryState();

Пример

CMemoryState msOld;
msOld.Checkpoint();
CPerson* pper1 = new CPerson();
CPerson* pper2 = new CPerson();
msOld.DumpAllObjectsSince();

CMemoryState::D ifference

Сравнивает два CMemoryState объекта, а затем сохраняет разницу в этом CMemoryState объекте.

BOOL Difference(
    const CMemoryState& oldState,
    const CMemoryState& newState);

Параметры

oldState
Начальное состояние памяти, определенное контрольной CMemoryState точкой.

newState
Новое состояние памяти, определенное контрольной CMemoryState точкой.

Возвращаемое значение

Ненулевое значение, если два состояния памяти отличаются; в противном случае — 0.

Замечания

Контрольная точка должна вызываться для каждого из двух параметров состояния памяти.

Пример

См. пример конструктора CMemoryState .

CMemoryState::D umpAllObjectsSince

Dump Вызывает функцию для всех объектов типа, производных от классаCObject, выделенного (и по-прежнему выделенного) с момента последнего вызова контрольной точки для этого CMemoryState объекта.

void DumpAllObjectsSince() const;

Замечания

Вызов DumpAllObjectsSince с неинициализированным CMemoryState объектом сбрасывает все объекты в памяти.

Пример

См. пример конструктора CMemoryState .

CMemoryState::D umpStatistics

Выводит краткий отчет статистики памяти из объекта, заполненного CMemoryState функцией-элементом "Разница ".

void DumpStatistics() const;

Замечания

В отчете, который печатается на устройстве afxDump , показано следующее:

Пример отчета содержит сведения о количестве (или количестве):

  • бесплатные блоки

  • обычные блоки

  • Блоки CRT

  • игнорировать блоки

  • клиентские блоки

  • максимальная память, используемая программой в любое время (в байтах)

  • общая память, используемая программой (в байтах)

Свободные блоки — это количество блоков, размещение которых было отложено, если afxMemDF задано значение delayFreeMemDF. Дополнительные сведения см . в разделе afxMemDF в разделе "Макросы mFC и глобальные".

Пример

Следующий код должен быть помещен в projnameApp.cpp. Определите следующие глобальные переменные:

static CMemoryState oldstate, newstate, diffstate;

InitInstance Добавьте строку в функцию:

oldstate.Checkpoint();

Добавьте обработчик функции ExitInstance и используйте следующий код:

newstate.Checkpoint();
if (diffstate.Difference(oldstate, newstate))
{
   TRACE(_T("Memory leaked\n"));
   diffstate.DumpStatistics();
}

Теперь вы можете запустить программу в режиме отладки, чтобы просмотреть выходные данные DumpStatistics функции.

См. также

Диаграмма иерархии