Практическое руководство. Получение снимков памяти
Этот раздел применим к:
Выпуск |
Visual Basic |
C# |
F# |
C++ |
Web Developer |
---|---|---|---|---|---|
Express |
![]() |
![]() |
![]() |
Только машинные коды |
![]() |
Pro, Premium и Ultimate |
![]() |
![]() |
![]() |
Только машинные коды |
![]() |
Примечание
Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от текущих настроек или выпуска.Чтобы изменить настройки, выберите "Параметры импорта и экспорта" в меню "Сервис".Дополнительные сведения см. в разделе Работа с параметрами.
Ниже показано, каким образом можно получить снимки памяти, позволяющие обнаружить утечки памяти.
Обнаружение утечек памяти
Создайте объект CMemoryState Members и вызовите функцию-член CMemoryState::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 — для Просмотр статистики памяти, по которой можно найти конкретное место утечки.