Освобождение памяти с помощью 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.
Задание
ЛегкоНапишите программу на языке C, которая демонстрирует полный жизненный цикл динамического выделения и освобождения памяти. Ваша программа должна:
- Считать целое число
countот пользователя, представляющее количество целых чисел для хранения - Использовать
malloc()вместе сsizeof()для динамического выделения памяти под массив изcountцелых чисел - Проверить, было ли выделение памяти успешным — если оно не удалось, вывести
Memory allocation failed!и завершить выполнение программы - Если выделение прошло успешно, вывести
Memory allocated successfully! - Считать
countцелых значений от пользователя и сохранить их в выделенном массиве - Вычислить и вывести сумму всех значений в формате:
Sum: [value] - Найти и вывести максимальное значение в формате:
Maximum: [value] - Использовать
free()для освобождения памяти - Вывести
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;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Основы указателей
Что такое указатель?Объявление указателейОператор взятия адреса (&)Оператор разыменования (*)Указатели NULLИтоги: Основы указателей4Проект: Простая текстовая утилита
Обзор проектаПодсчет символов2Указатели и массивы
Имена массивов как указателиЭлементы массива — указателиАрифметика указателейСравнение указателейИтоги: Обход массива через указатели5Указатели и функции
Передача по значениюПередача указателей в функцииИзменение переменных через указателиКлассический пример: SwapПередача массивов в функцииИтоги: указатели как аргументы функций8Структуры и указатели
Указатели на структурыОператор «стрелка» (->)Передача структур по значениюПередача указателей на структурыДинамическое выделение памяти для структурИтоги: Изменение структур через указатели11Итоговые задачи на повторение
Повторение: динамическая конкатенация строкПовторение: массив структурПовторение: счетчик частоты слов3Символьные массивы и строки
Строки как массивы charНуль-терминаторВвод строк с помощью scanfИспользование strlen()Использование strcpy()Использование strcat()Использование strcmp()Итоги: основные строковые функции6Управление памятью
Стек против кучиДинамическое выделение — malloc()Использование sizeof() для выделения памятиПроверка ошибок выделения памятиОсвобождение памяти с помощью free()Выделение памяти с помощью calloc()Итоги: Динамический массив