Включение обнаружения утечек памяти
Обновлен: Ноябрь 2007
Этот раздел применим к:
Выпуск |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Экспресс-выпуск |
![]() |
![]() |
Только машинный код |
![]() |
Standard |
![]() |
![]() |
Только машинный код |
![]() |
Pro и Team |
![]() |
![]() |
Только машинный код |
![]() |
Обозначения:
![]() |
Применяется |
![]() |
Неприменимо |
![]() |
Команда или команды скрытый по умолчанию. |
Основные инструменты для обнаружения утечки памяти — это отладчик и отладочные функции кучи библиотеки времени выполнения C (CRT). Чтобы включить отладочные функции кучи, вставьте в программу следующие операторы:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
![]() |
---|
Операторы #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.