ПрограммированиеC разработчик

Опишите механизм работы динамического выделения и освобождения памяти в C, основные функции (malloc, calloc, realloc, free) и распространённые ошибки при их использовании.

Проходите собеседования с ИИ помощником Hintsage

Ответ

В языке 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.