Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Предоставляет удобный способ обнаружения утечки памяти в программе.
Синтаксис
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 функции.