Поделиться через


Практическое руководство. Получение снимков памяти

Обновлен: Ноябрь 2007

Этот раздел применим для следующих версий.

Выпуск

Visual Basic

C#

C++

Web Developer

Экспресс-выпуск

Тема не применяется Тема не применяется

Только машинные коды

Тема не применяется

Standard

Тема не применяется Тема не применяется

Только машинные коды

Тема не применяется

Pro и Team

Тема не применяется Тема не применяется

Только машинные коды

Тема не применяется

Условные обозначения:

Тема применяется

Применимо

Тема не применяется

Неприменимо

Тема применяется, но команда по умолчанию сокрыта

Команда или команды по умолчанию скрыты.

8ky2wh64.alert_note(ru-ru,VS.90).gifПримечание.

Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от активных параметров или версии. Чтобы изменить настройки, выберите "Параметры импорта и экспорта" в меню "Сервис". Дополнительные сведения см. в разделе Параметры Visual Studio.

Ниже показано, каким образом можно получить снимки памяти, позволяющие обнаружить утечки памяти.

Обнаружение утечек памяти

  1. Создайте объект CMemoryState Members и вызовите функцию-член Checkpoint. В результате будет создан первый снимок памяти.

  2. После того как программа выполнит операцию по выделению или освобождению памяти, создайте другой объект CMemoryState и вызовите функцию Checkpoint уже для него. Так получится второй снимок памяти.

  3. Создайте третий объект 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 — для Просмотр статистики памяти, по которой можно найти конкретное место утечки.

См. также

Ссылки

_DEBUG

Другие ресурсы

Обнаружение утечек памяти в MFC