Обнаружение утечек памяти в C

При написании программ, использующих динамическое выделение памяти (функции malloc, calloc, realloc, free), необходимо помнить об освобождении всей когда-либо выделенной памяти. «Утечкой памяти» называется ситуация, когда программа по каким-либо причинам не освобождает память, которая больше не будет использоваться. Необходимо уметь обнаруживать подобные проблемы!

Далее приводятся практические советы для обнаружения утечек памяти в зависимости от используемого компилятора.

Microsoft Visual C Compiler / MS Windows

В начале вашей программы добавьте следующие строки (важно соблюдать порядок!)

#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.

Указана следующая информация о каждой утечке памяти: место в файле, где память была выделена, размер выделенной памяти и ее содержимое.

GNU Compiler Collection / Linux

В начале вашей программы добавьте следующую строку

#include <mcheck.h>

и в самое начало функции main вызов

mtrace();

Затем просто запускаете вашу программу и после нее утилиту mtrace

gcc -g leak.c && ./a.out
mtrace a.out /tmp/trace.txt

Вывод утилиты mtrace содержит информацию об утечках памяти с указанием места в файле, где память была выделена, и размера выделенной памяти.

GNU Compiler Collection (MinGW) / MS Windows

Устанавливаете программу 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)

Также можно найти информацию об источнике утечки в исходном коде программы с указанием места в файле.