free() - функция языка Си


#include <stdlib.h>
void free (void *ptr);
// ptr - Указатель на блок памяти для освобождения 
// Не возвращает значения.

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

Функция free() не возвращает значения.

Функция free() не проверяет указатель ptr на правильность (не NULL) и не обнуляет адрес указателя после освобождения памяти, что может привести к «освобождению» невыделенной или уже освобожденной памяти, что в некоторых случаях может привести к необратимому повреждению кучи (heap). Вызов функции с NULL безопасен (проверка на NULL обязана выполняться внутри free() согласно стандарту). Для избежания повреждения кучи некоторые руководства по языку Си рекомендуют обнулять каждый освобождаемый указатель, после вызова функции free.

Пример программы с обнулением указателя после освобождения памяти функцией free(). Также следует обратить внимание что неинициализированный указатель указывает на случайную область памяти (не равен NULL).


#include <stdlib.h> // free(), malloc()
#include <stdio.h> // printf()
int main(){
    int *ptr; // Определяем указатель (не инициализирован)
    printf("%p \n", ptr); //> 0000000000000010 Выводим адрес неинициализированного указателя
    ptr = malloc(10 * sizeof(*ptr)); // Выделяем память под 10 элементов типа *ptr
    printf("%p \n", ptr); //> 00000000001F1460 Выводим адрес указателя на выделенную память
    void free(void *ptr); // Освобождаем выделенную память
    printf("%p \n", ptr); //> 00000000001F1460 Выводим адрес указателя на выделенную память. Хоть память и освободилась адрес указателя не изменился. И повторное free(ptr) может повредить находящиеся там "новые" данные.
    ptr = NULL; // Обнуляем указатель
    printf("%p \n", ptr); //> 0000000000000000 Теперь указатель безопасен для случайного повторного free(ptr)
}
2023-03-08



Понравилась страница?
Добавить в закладки
Или поделиться!

Связанные темы

Статические и динамические массивы в языке Си. Описание и примеры кода.

#include void * malloc(size_t size_in_bytes); // size_in_bytes - Размер памяти требуемый для выделения, в байтах. // Возвращаемое значение - указатель на начало блока непрерывной выделенной памяти. Или ноль в случае неудачи.
memccpy() функция языка Си. Копирование блока памяти с поиском символа.
memcpy() функция языка Си. Копирование области памяти.
memmove() функция языка Си. Перемещение областей памяти.
restrict ключевое слово языка Си.
sizeof оператор в языке Си. Узнать размер переменной.