Страницы

Поиск по вопросам

четверг, 20 декабря 2018 г.

Как отследить утечку памяти

Работаю под Visual Studio. Как узнать, есть ли в программе утечка памяти или нет?


Ответ

Возможно обнаружение утечек памяти с помощью отладчика и отладочных функций кучи библиотеки CRT (библиотеки времени выполнения). Включаются они так:
#define _CRTDBG_MAP_ALLOC #include #include
Важно, что инструкции include/define следуют в таком порядке.
Включение заголовочного файла сопоставляет функции malloc и free с их отладочными версиями: _malloc_dbg и free. Инструкция define позволит сделать дамп утечки памяти более подробным (вообще говоря, она сопоставляет базовые версии функций кучи CRT соответствующим отладочным версиям).
Далее помещаем вызов _CrtDumpMemoryLeaks перед точкой выхода приложения для отображения отчета об утечке памяти перед завершением работы приложения:
_CrtDumpMemoryLeaks();
Если точек выхода несколько, нет нужды писать вызов этой функции повсеместно. Достаточно вызвать в начале работы приложения функцию _CrtSetDbgFlag, что приведет к автоматическому вызову функции _CrtDumpMemoryLeaks в каждой точке выхода. Для этого надо установить значения двух битовых полей:
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
По умолчанию _CrtDumpMemoryLeaks выводит отчет об утечке памяти в область Отладка окна Вывод
Далее смотрите полученные данные, там четко указывается тип блока, его расположение, размер утечки и еще некоторая информация. Блоки бывают разных типов (см. справку CRT).
Примечание: В некоторых случаях _CrtDumpMemoryLeaks может ошибочно диагностировать утечку памяти, но я не буду здесь расписывать данные ситуации, если потребуется или Вы не разберетесь самостоятельно - пишите комментарии;)

Комментариев нет:

Отправить комментарий