Visual C++. Описание стандартных классов - CMemoryState
ОГЛАВЛЕНИЕ
Страница 95 из 238
CMemoryState
Класс CMemoryState используется для выявления утечек памяти в приложении. Утечки памяти возникают в тех случаях, когда выделенная под объект область памяти не освобождается после завершения работы с этим объектом. Утечки памяти могут привести к возникновению ошибок при выполнении приложения или к исчерпанию ресурса свободной памяти. Память может выделяться и освобождаться различными способами: с использованием функций malloc и free в библиотеках времени исполнения приложения;с использованием функций Windows API LocalAlloc и LocalFree или GlobalAlloc и GlobalFree;
с использованием операций C++ new и delete.
Функции класса CMemoryState позволяют обнаруживать только утечки памяти, связанные с использованием операций C++, поскольку программисты Microsoft, очевидно, уверены, что их программы к утечкам памяти никакого отношения иметь не могут. Нам бы их уверенность. Для получения дополнительной информации используется макрос DEBUG_NEW, заменяющий стандартную операцию new ee отладочной версией. Использование этой версии позволяет сохранять информацию о том, в каком файле и в какой его строке был выделен каждый из блоков памяти. Как и любые другие диагностические функции, методы класса CMemoryState работают только в отладочной версии приложения, отличающейся тем, что в ней определена константа _DEBUG. При поиске утечек памяти используются функции Checkpoint, Difference и DumpStatistics, позволяющие выявить различия в состоянии памяти в различных точках приложения. Если информации, полученной при этих сравнениях, окажется недостаточно для выявления источника утечек памяти, для получения дополнительной информации может быть вызвана функция DumpAllObjectsSince, выводящая информацию по всем объектам, память для которых была выделена после последнего вызова функции Checkpoint. Объекты в распечатке будут располагаться в порядке выделения для них оперативной памяти и для каждого из них будет указан файл и строка, в которой произошло выделение памяти, (если в программе использован макрос DEBUG_NEW), происхождение объекта, его адрес и размер. Кроме того, функция DumpAllObjectsSince вызывает для каждого объекта его функцию Dump, выводящую информацию о его текущем состоянии. Объявление объекта типа CMemoryState и вызов его функций должен производиться между директивами #if defined(_DEBUG) и #endif, что обеспечит обращение к ним только в отладочной версии приложения. Описание данной структуры содержится в файле заголовка afx.h.