При написании программ, использующих динамическое выделение памяти (функции malloc, calloc, realloc, free
), необходимо помнить об освобождении всей когда-либо выделенной памяти. «Утечкой памяти» называется ситуация, когда программа по каким-либо причинам не освобождает память, которая больше не будет использоваться. Необходимо уметь обнаруживать подобные проблемы!
Далее приводятся практические советы для обнаружения утечек памяти в зависимости от используемого компилятора.
В начале вашей программы добавьте следующие строки (важно соблюдать порядок!)
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
и затем добавьте в конец вашей функции main
вызов
_CrtDumpMemoryLeaks();
Эта функция распечатает сообщение в Output window с информацией об утечках памяти, если таковые имеются.
Ниже показан пример такого сообщения
Detected memory leaks!
Dumping objects ->
...\leaktest\leak.c(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.
Указана следующая информация о каждой утечке памяти: место в файле, где память была выделена, размер выделенной памяти и ее содержимое.
В начале вашей программы добавьте следующую строку
#include <mcheck.h>
и в самое начало функции main
вызов
mtrace();
Затем просто запускаете вашу программу и после нее утилиту mtrace
gcc -g leak.c && ./a.out
mtrace a.out /tmp/trace.txt
Вывод утилиты mtrace
содержит информацию об утечках памяти с указанием места в файле, где память была выделена, и размера выделенной памяти.
Устанавливаете программу Dr. Memory.
Модификаций исходного текста программы не требуется. Необходимо скомпилировать программу со следующими флагами:
gcc.exe -ggdb -m32 leak.c
Затем запустить вашу программу с помощью Dr. Memory:
drmemory.exe -- a.out
Вывод содержит информацию о имеющихся проблемах при работе с динамической памятью, в частности об утечках памяти:
~~Dr.M~~ 9 unique, 282 total, 5860 byte(s) of leak(s)
~~Dr.M~~ 0 unique, 0 total, 0 byte(s) of possible leak(s)
Также можно найти информацию об источнике утечки в исходном коде программы с указанием места в файле.