Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Примечание.
Библиотека классов Microsoft Foundation (MFC) продолжает поддерживаться. Однако мы больше не добавляем функции или обновляем документацию.
Предоставляет удобный способ обнаружения утечки памяти в программе.
Синтаксис
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();
Замечания
Функции-члены CMemoryStateDifference и 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 функции.