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 호출은 동일한 메모리 영역 전체 또는 일부를 할당하는 이후의 모든 할당 함수 호출과 동기화됩니다(synchronizes-with) . 이 동기화는 해제 함수에 의한 메모리 접근 이후에 발생하며, 할당 함수에 의한 메모리 접근 이전에 발생합니다. 각 특정 메모리 영역에 대해 동작하는 모든 할당 및 해제 함수에는 단일 총 순서(single total order)가 존재합니다.

(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이 아니면 realloc에 의해 p2가 해제됨
       free(p3);
    else // p3가 null이면 p2가 해제되지 않음
       free(p2);
}

참고문헌

  • C23 표준 (ISO/IEC 9899:2024):
  • 7.24.3.3 free 함수 (p: 365)
  • C17 표준 (ISO/IEC 9899:2018):
  • 7.22.3.3 free 함수 (p: 254)
  • C11 표준 (ISO/IEC 9899:2011):
  • 7.22.3.3 free 함수 (p: 348)
  • C99 표준 (ISO/IEC 9899:1999):
  • 7.20.3.2 free 함수 (p: 313)
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • 4.10.3.2 free 함수

참고 항목

메모리 할당
(함수)
이전에 할당된 크기 지정 메모리 해제
(함수)
이전에 할당된 크기 및 정렬 지정 메모리 해제
(함수)