В языке C для динамического управления памятью используются функции из библиотеки stdlib.h:
malloc(size_t size) — выделяет блок памяти заданного размера. Память не инициализирована.calloc(size_t nmemb, size_t size) — выделяет блок памяти под массив из nmemb элементов заданного размера и инициализирует нулями.realloc(void *ptr, size_t size) — изменяет размер ранее выделенного блока памяти.free(void *ptr) — освобождает ранее выделенный блок.Пример использования:
int *arr = (int *)malloc(10 * sizeof(int)); if (arr == NULL) { // Обработка ошибки выделения памяти } // ... работа с arr ... free(arr);
Важно всегда проверять результат выделения памяти на NULL и не забывать вызывать free, чтобы избежать утечек памяти.
Какой результат будет у следующего кода?
int *arr = malloc(sizeof(int) * 5); free(arr); free(arr);
Ответ: Повторный вызов free для одной и той же области памяти приводит к неопределённому поведению (undefined behavior). Освобождать один и тот же указатель можно только один раз.
История
В проекте на автоматизации тестирования системы были регулярные сбои. Виновником оказался системный цикл, где после каждого прохода забывали освобождать память, выделенную через
malloc. В результате длительных тестов система "ела" всю оперативную память и зависала.
История
Реализация динамического массива использовала
realloc, не проверяя результат возврата. При неудаче (realloc вернул NULL) указатель на старую память теряли, и происходила утечка памяти. Последующая попытка работы с памятью приводила к сегфолту.
История
Разработчику поручили интегрировать устаревший C-модуль, где память освобождалась через
freeдважды подряд по одной ссылке. На большинстве операционных систем ошибки не появлялись, но на новой платформе приложение стало аварийно завершаться, причина обнаружилась спустя много времени: double-free.