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


Включение обнаружения утечек памяти

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

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

Выпуск

Visual Basic

C#

C++

Web Developer

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

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

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

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

Standard

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

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

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

Pro и Team

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

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

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

Обозначения:

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

Применяется

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

Неприменимо

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

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

Основные инструменты для обнаружения утечки памяти — это отладчик и отладочные функции кучи библиотеки времени выполнения C (CRT). Чтобы включить отладочные функции кучи, вставьте в программу следующие операторы:

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
e5ewb1h3.alert_note(ru-ru,VS.90).gifПримечание.

Операторы #include должны идти именно в таком порядке, как показано выше. Если изменить порядок операторов, функции могут работать неправильно.

С помощью crtdbg.h можно сопоставить функции malloc и free с их отладочными версиями __malloc_dbg и __free_dbg, которые отслеживают процессы выделения и освобождения памяти. Это сопоставление используется только в отладочном построении (в котором определен _DEBUG). В окончательных построениях используются первоначальные функции malloc и free.

Оператор #define сопоставляет базовые версии функций кучи CRT в соответствующих отладочных версиях. Этот оператор не является обязательным, но без него дамп утечки памяти будет менее информативен.

Если добавить указанные выше операторы, можно будет выводить сведения об утечке памяти, включив в программу строку:

_CrtDumpMemoryLeaks();

Если программа запущена под отладчиком, __CrtDumpMemoryLeaks будет отображать сведения об утечке памяти в Окне вывода. Эти сведения выглядят следующим образом:

Detected memory leaks!
Dumping objects ->
C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18} 
normal block at 0x00780E80, 64 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.

Если оператор #define _CRTDBG_MAPALLOC не используется, дамп утечки памяти будет выглядеть следующим образом:

Detected memory leaks!
Dumping objects ->
{18} normal block at 0x00780E80, 64 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.

Если _CRTDBG_MAP_ALLOC не определен, на экране отобразится следующее:

  • Номер выделения памяти (в фигурных скобках).

  • Тип блока может быть обычным, клиентским или CRT.

  • Расположение памяти в шестнадцатеричном формате.

  • Размер блока в байтах.

  • Содержимое первых 16 байтов также в шестнадцатеричном формате.

Если _CRTDBG_MAP_ALLOC определен, на экране также отобразится файл, вызвавший утечку. Число в круглых скобках, следующее за именем файла (в этом примере 20), — это номер строки внутри файла.

Переход к строке исходного файла, в которой выделяется память

  • Дважды щелкните в окне Вывод строку, в которой содержится имя файла и номер строки.

    —либо—

    Выберите в окне Вывод строку, в которой содержится имя файла и номер строки, и нажмите F4.

_CrtSetDbgFlag

Вызвать _CrtDumpMemoryLeaks несложно, если программа всегда завершается в одном и том же месте. Если же это происходит каждый раз в разных местоположениях, то вместо того, чтобы вызывать _CrtDumpMemoryLeaks при каждом возможном выходе, поместите в начало программы следующий код вызова:

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

Этот оператор автоматически вызывает _CrtDumpMemoryLeaks при выходе из программы. Следует установить значения для битовых полей _CRTDBG_ALLOC_MEM_DF и _CRTDBG_LEAK_CHECK_DF таким образом, как показано выше.

Установка режима отчета CRT

По умолчанию _CrtDumpMemoryLeaks выводит сведения об утечке памяти в область Отладка окна Вывод, согласно приведенному выше описанию. Дамп можно перенаправить в другое местоположение с помощью _CrtSetReportMode. Если используется библиотека, это можно сделать с ее помощью. В этом случае можно вернуть место вывода обратно в окно Вывод, применив следующий оператор:

_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );

Дополнительные сведения см. в разделе _CrtSetReportMode.

См. также

Основные понятия

Обнаружение и изоляция утечек памяти