В языке C память для переменных может выделяться либо в стеке (stack), либо в куче (heap).
malloc, calloc, realloc, и освобождается вручную через free. Объем памяти ограничивается возможностями системы, но доступ медленнее и вручную контролируется освобождение.Когда использовать стек:
Когда использовать кучу:
// В стеке int arr[10]; // В куче int* parr = malloc(sizeof(int) * 10); // Не забудьте освободить память free(parr);
Вопрос: Что произойдет, если к массиву, выделенному через malloc, не вызвать функцию free?
Ответ: Произойдет утечка памяти (memory leak). Динамически выделенная память не будет автоматически освобождена, и с течением времени это может привести к исчерпанию памяти приложения или всей системы.
void leak() { int* leakArr = malloc(100 * sizeof(int)); // Нет вызова free(leakArr), память теряется }
История
В одном проекте программисты выделяли память для структуры, описывающей сессию пользователя, через malloc, но забыли вызывать free по окончании работы с сессией. В результате проект в течение нескольких дней терял память, сервер "падал" с ошибкой недостатка памяти. Проблема была решена только после профилирования с Valgrind и исправления всех пропущенных free.
История
Разработчик выделял большой массив (до 10 МБ) в стеке для временных расчетов. На сервере с малым размером стека это приводило к краху приложения с ошибкой stack overflow. После анализа пришлось перевести буфер в кучу.
История
Один из разработчиков решил хранить длинные строки в стеке, но размер строки субъектно задавался пользователем. При вводе очень длинной строки приложение падало с ошибкой доступа к памяти. В итоге было принято решение переносить вводимые данные в кучу с проверкой длины.