Освобождение памяти с помощью free()
Часть раздела Логика и управление потоком путешествия по C на Coddy. Урок 35 из 63.
Когда вы динамически выделяете memory с помощью malloc(), эта memory остаётся allocated, пока вы явно не освободите её. Функция free() — ваш инструмент для возврата динамически выделенной memory системе, когда вы закончите using её.
Функция free() принимает один аргумент: указатель на блок памяти, который вы хотите освободить. Это должен быть тот же указатель, который был возвращён функцией malloc() (или связанными с ней функциями, такими как calloc()).
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // Выделить память
*ptr = 42; // Использовать память
free(ptr); // Освободить память, когда законченоНеспособность вызвать free() приводит к тому, что называется утечкой памяти. Выделенная память остаётся зарезервированной вашей программой, даже если вы больше не используете её. В длительно работающих программах или программах, которые многократно выделяют память, такие утечки могут израсходовать всю доступную системную память и вызвать проблемы с производительностью или сбои.
Помни: каждому malloc() должен соответствовать free(). Это соответствие необходимо для ответственного управления memory в программировании на C.
Задание
ЛегкоНапишите программу на C, демонстрирующую полный жизненный цикл динамического выделения и освобождения памяти. Ваша программа должна:
- Считать у пользователя значение integer
count, представляющее количество integer для хранения - Использовать
malloc()вместе сsizeof()для динамического выделения памяти под массив изcountinteger - Проверить, was ли выделение памяти successful — если оно завершится ошибкой, вывести
Memory allocation failed!и завершить программу - Если выделение прошло успешно, вывести
Memory allocated successfully! - Считать у пользователя
countзначений типа integer и store их в выделенном массиве - Calculate и вывести сумму всех values в формате:
Sum: [value] - Найти и вывести maximum value в формате:
Maximum: [value] - Использовать
free()для освобождения памяти - Вывести
Memory freed successfully!, чтобы подтвердить очистку
Не забудьте подключить заголовочный файл <stdlib.h>, чтобы использовать malloc() и free(). Эта задача демонстрирует essential pairing malloc() и free() для предотвращения утечек памяти в ваших программах.
Например, если входные данные имеют вид:
4
15 8 23 12Вывод должен быть следующим:
Memory allocated successfully!
Sum: 58
Maximum: 23
Memory freed successfully!Эта задача закрепляет critical concept: каждый динамически выделенный блок памяти должен быть proper freed, когда он больше не нужен, что завершает responsible memory management cycle в программировании на C.
Попробуйте сами
#include <stdio.h>
#include <stdlib.h>
int main() {
int count;
// Считать количество целых чисел для хранения
scanf("%d", &count);
// TODO: Напишите ваш код ниже
// 1. Выделите память с помощью malloc() и sizeof()
// 2. Проверьте, успешно ли выполнено выделение
// 3. Считайте целочисленные значения и сохраните их
// 4. Вычислите сумму и найдите максимум
// 5. Освободите выделенную память
return 0;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Основы указателей
Что такое указатель?Объявление указателейОператор взятия адреса (&)Оператор разыменования (*)Указатели NULLИтоги: Основы указателей4Проект: Простая текстовая утилита
Обзор проектаПодсчет символов2Указатели и массивы
Имена массивов как указателиЭлементы массива — указателиАрифметика указателейСравнение указателейИтоги: Обход массива через указатели5Указатели и функции
Передача по значениюПередача указателей в функцииИзменение переменных через указателиКлассический пример: SwapПередача массивов в функцииИтоги: указатели как аргументы функций8Структуры и указатели
Указатели на структурыОператор «стрелка» (->)Передача структур по значениюПередача указателей на структурыДинамическое выделение памяти для структурИтоги: Изменение структур через указатели11Итоговые задачи на повторение
Повторение: динамическая конкатенация строкПовторение: массив структурПовторение: счетчик частоты слов3Символьные массивы и строки
Строки как массивы charНуль-терминаторВвод строк с помощью scanfИспользование strlen()Использование strcpy()Использование strcat()Использование strcmp()Итоги: основные строковые функции6Управление памятью
Стек против кучиДинамическое выделение — malloc()Использование sizeof() для выделения памятиПроверка ошибок выделения памятиОсвобождение памяти с помощью free()Выделение памяти с помощью calloc()Итоги: Динамический массивПотренируйтесь самостоятельно: Онлайн-компилятор C