Практическое руководство. Получение снимков памяти
Обновлен: Ноябрь 2007
Этот раздел применим для следующих версий.
Выпуск |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Экспресс-выпуск |
![]() |
![]() |
Только машинные коды |
![]() |
Standard |
![]() |
![]() |
Только машинные коды |
![]() |
Pro и Team |
![]() |
![]() |
Только машинные коды |
![]() |
Условные обозначения:
![]() |
Применимо |
![]() |
Неприменимо |
![]() |
Команда или команды по умолчанию скрыты. |
![]() |
---|
Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от активных параметров или версии. Чтобы изменить настройки, выберите "Параметры импорта и экспорта" в меню "Сервис". Дополнительные сведения см. в разделе Параметры Visual Studio. |
Ниже показано, каким образом можно получить снимки памяти, позволяющие обнаружить утечки памяти.
Обнаружение утечек памяти
Создайте объект CMemoryState Members и вызовите функцию-член Checkpoint. В результате будет создан первый снимок памяти.
После того как программа выполнит операцию по выделению или освобождению памяти, создайте другой объект CMemoryState и вызовите функцию Checkpoint уже для него. Так получится второй снимок памяти.
Создайте третий объект CMemoryState и вызовите его функцию-член CMemoryState::Difference, используя в качестве аргументов два предыдущих объекта CMemoryState. Если между двумя состояниями памяти есть различия, функция Difference вернет отличное от нуля значение. Это значение будет свидетельствовать о наличии неосвобожденных блоков памяти.
Пример кода выглядит следующим образом:
// Declare the variables needed #ifdef _DEBUG CMemoryState oldMemState, newMemState, diffMemState; oldMemState.Checkpoint(); #endif // Do your memory allocations and deallocations. CString s("This is a frame variable"); // The next object is a heap object. CPerson* p = new CPerson( "Smith", "Alan", "581-0215" ); #ifdef _DEBUG newMemState.Checkpoint(); if( diffMemState.Difference( oldMemState, newMemState ) ) { TRACE( "Memory leaked!\n" ); } #endif
Обратите внимание, что операторы проверки памяти заключаются в блоки #ifdef _DEBUG / #endif, поэтому они компилируются только в отладочных версиях программы, ориентированных на Win32.
Теперь, когда известно о наличии утечки, можно применить другую функцию-член — CMemoryState::DumpStatistics — для Просмотр статистики памяти, по которой можно найти конкретное место утечки.