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

Этот раздел применим к:

Выпуск

Visual Basic

C#

F#

C++

Web Developer

Express

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

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

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

Pro, Premium и Ultimate

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

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

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

Примечание

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

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

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

  1. Создайте объект CMemoryState Members и вызовите функцию-член CMemoryState::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