Структура 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.
Если вы подозреваете, что у вашей программы утечка памяти, можно использовать Checkpoint
Difference
функцию и 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
функции.