Namespaces
Variants

free

From cppreference.net
Определено в заголовочном файле <stdlib.h>
void free ( void * ptr ) ;

Освобождает пространство, ранее выделенное с помощью malloc() , calloc() , aligned_alloc() , (начиная с C11) или realloc() .

Если ptr является нулевым указателем, функция ничего не делает.

Поведение не определено, если значение ptr не равно значению, возвращённому ранее функцией malloc() , calloc() , realloc() , или aligned_alloc() (начиная с C11) .

Поведение не определено, если область памяти, на которую ссылается ptr , уже была освобождена, то есть, free() , free_sized() , free_aligned_sized() (since C23) , или realloc() уже была вызвана с ptr в качестве аргумента и после этого не было вызовов malloc() , calloc() , realloc() , или aligned_alloc() (since C11) , которые вернули бы указатель, равный ptr .

Поведение не определено, если после возврата из free() осуществляется доступ через указатель ptr (если только другая функция выделения памяти случайно не вернула значение указателя, равное ptr ).

free является потокобезопасной: она ведет себя так, как если бы обращалась только к ячейкам памяти, видимым через ее аргумент, и не к какому-либо статическому хранилищу.

Вызов free , который освобождает область памяти, синхронизируется-с вызовом любой последующей функции выделения памяти, которая выделяет ту же самую или часть той же области памяти. Эта синхронизация происходит после любого доступа к памяти функцией освобождения и до любого доступа к памяти функцией выделения. Существует единый полный порядок всех функций выделения и освобождения памяти, работающих с каждой конкретной областью памяти.

(начиная с C11)

Содержание

Параметры

ptr - указатель на освобождаемую область памяти

Возвращаемое значение

(нет)

Примечания

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

Пример

#include <stdlib.h>
int main(void)
{
    int *p1 = malloc(10*sizeof *p1);
    free(p1); // каждый выделенный указатель должен быть освобожден
    int *p2 = calloc(10, sizeof *p2);
    int *p3 = realloc(p2, 1000*sizeof *p3);
    if(p3) // p3 не null означает, что p2 был освобожден realloc
       free(p3);
    else // p3 null означает, что p2 не был освобожден
       free(p2);
}

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
  • 7.24.3.3 Функция free (стр: 365)
  • Стандарт C17 (ISO/IEC 9899:2018):
  • 7.22.3.3 Функция free (стр. 254)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 7.22.3.3 Функция free (стр. 348)
  • Стандарт C99 (ISO/IEC 9899:1999):
  • 7.20.3.2 Функция free (стр. 313)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
  • 4.10.3.2 Функция free

Смотрите также

выделяет память
(функция)
освобождает ранее выделенную память с указанным размером
(функция)
освобождает ранее выделенную выровненную память с указанным размером
(функция)