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

204
27 октября 2017, 13:32

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

Answer 1

Возможно обнаружение утечек памяти с помощью отладчика и отладочных функций кучи библиотеки CRT (библиотеки времени выполнения). Включаются они так:

#define _CRTDBG_MAP_ALLOC 
#include <stdlib.h>
#include <crtdbg.h>  

Важно, что инструкции include/define следуют в таком порядке.

Включение заголовочного файла <crtdbg.h> сопоставляет функции malloc и free с их отладочными версиями: _malloc_dbg и free. Инструкция define позволит сделать дамп утечки памяти более подробным (вообще говоря, она сопоставляет базовые версии функций кучи CRT соответствующим отладочным версиям).

Далее помещаем вызов _CrtDumpMemoryLeaks перед точкой выхода приложения для отображения отчета об утечке памяти перед завершением работы приложения:

_CrtDumpMemoryLeaks();

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

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

По умолчанию _CrtDumpMemoryLeaks выводит отчет об утечке памяти в область Отладка окна Вывод.

Далее смотрите полученные данные, там четко указывается тип блока, его расположение, размер утечки и еще некоторая информация. Блоки бывают разных типов (см. справку CRT).

Примечание: В некоторых случаях _CrtDumpMemoryLeaks может ошибочно диагностировать утечку памяти, но я не буду здесь расписывать данные ситуации, если потребуется или Вы не разберетесь самостоятельно - пишите комментарии;)

Answer 2

Используйте встроенный профилировщик памяти.

READ ALSO
:hover не работает

:hover не работает

Не работает hover

294
Из &lt;select&gt; в dropdown

Из <select> в dropdown

Здравствуйте! На сайте есть <select> необходимо переделать его под бутстраповский dropdown (не спрашивайте зачем))Т

251