Поиск Memory Leaks в VisualStudio
Автор: Вячеслав Е.
Поиск и устранение утечек памяти в Visual Studio.
Найти утечки памяти в программе можно следующим способом:
Первое что следует сделать:
В заголовочный файл который включается всеми другими файлами(например "stdafx.h") в начало нужно поместить следующие строки:
#define _CRTDBG_MAP_ALLOC #include <stdlib.h> #include <crtdbg.h>
Этим мы заменяем функции malloc и free другими malloc_dbg и free_dbg, которые будут выполнять проверки.
Затем в функцию, где начинается работа программы(WinMain()) в начало добавляем следующее:
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
Благодаря этой функции после возвращения вашей программой контроля системе, все утечки памяти будут напечатаны в окне Output в следующем виде:
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.
В фигурных скобках показывается номер выделения памяти, которая не была удалена.
Можно перейти к месту в коде, где прошло выделение памяти по двойному клику на строчке
C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18}
, но обычно это не сильно помогает.
Также можно изменить место, куда будет писаться информация об утечках с помощью функции _CrtSetReportMode (см. MSDN)
Теперь переходим ко второй части - избавление от утечек:
В начало функции, где начинается работа программы нужно добавить:
_CrtSetBreakAlloc(num); // где num - номер утечки
после этого запустить Debug режим.
В момент выделения вылетит окошко с ошибкой ("User breakpoint").
Нужно нажать кнопку break и перемещаться вверх в окне Call Stack до вашей функции, которая вызвала выделение неудалённой памяти.
12 октября 2009 (Обновление: 11 июня 2010)