Menu
Coddy logo textTech

Освобождение памяти с помощью free()

Часть раздела Logic & Flow путешествия по C на Coddy — урок 35 из 63.

Когда вы динамически выделяете память с помощью malloc(), эта память остается выделенной до тех пор, пока вы явно не освободите ее. Функция free() — это ваш инструмент для возврата динамически выделенной памяти обратно системе, когда вы закончили ее использовать.

Функция free() принимает один аргумент: указатель на блок памяти, который вы хотите освободить. Это должен быть тот же указатель, который был возвращен malloc() (или родственными функциями, такими как calloc()).

#include <stdlib.h>

int *ptr = (int*)malloc(sizeof(int));  // Выделение памяти
*ptr = 42;  // Использование памяти
free(ptr);  // Освобождение памяти после завершения

Невызов free() приводит к возникновению так называемой утечки памяти. Выделенная память остается зарезервированной вашей программой, даже если вы ее больше не используете. В долго работающих программах или программах, которые многократно выделяют память, эти утечки могут поглотить всю доступную системную память и вызвать проблемы с производительностью или сбои.

Помните: каждый malloc() должен иметь соответствующий free(). Такая пара необходима для ответственного управления памятью в программировании на C.

challenge icon

Задание

Легко

Напишите программу на языке C, которая демонстрирует полный жизненный цикл динамического выделения и освобождения памяти. Ваша программа должна:

  1. Считать целое число count от пользователя, представляющее количество целых чисел для хранения
  2. Использовать malloc() вместе с sizeof() для динамического выделения памяти под массив из count целых чисел
  3. Проверить, было ли выделение памяти успешным — если оно не удалось, вывести Memory allocation failed! и завершить выполнение программы
  4. Если выделение прошло успешно, вывести Memory allocated successfully!
  5. Считать count целых значений от пользователя и сохранить их в выделенном массиве
  6. Вычислить и вывести сумму всех значений в формате: Sum: [value]
  7. Найти и вывести максимальное значение в формате: Maximum: [value]
  8. Использовать free() для освобождения памяти
  9. Вывести Memory freed successfully! для подтверждения очистки

Не забудьте включить заголовочный файл <stdlib.h> для использования malloc() и free(). Эта задача демонстрирует обязательную связку malloc() и free() для предотвращения утечек памяти в ваших программах.

Например, если на вход подается:

4
15 8 23 12

Ваш вывод должен быть следующим:

Memory allocated successfully!
Sum: 58
Maximum: 23
Memory freed successfully!

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

Шпаргалка

Используйте free() для освобождения памяти, выделенной с помощью malloc():

#include <stdlib.h>

int *ptr = (int*)malloc(sizeof(int));  // Выделение памяти
*ptr = 42;  // Использование памяти
free(ptr);  // Освобождение памяти по завершении

Каждый вызов malloc() должен иметь соответствующий free() для предотвращения утечек памяти. Указатель, передаваемый в free(), должен быть тем же указателем, который вернул malloc().

Попробуйте сами

#include <stdio.h>
#include <stdlib.h>

int main() {
    int count;
    
    // Считать количество целых чисел для хранения
    scanf("%d", &count);
    
    // TODO: Напишите свой код ниже
    // 1. Выделите память с помощью malloc() и sizeof()
    // 2. Проверьте, было ли выделение памяти успешным
    // 3. Считайте целочисленные значения и сохраните их
    // 4. Вычислите сумму и найдите максимум
    // 5. Освободите выделенную память
    
    return 0;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Logic & Flow