`free_sized` — 크기를 아는 상태에서 메모리를 해제하는 함수

free_sized — 크기를 아는 상태에서 메모리를 해제하는 함수 (C23)

free는 해제할 메모리의 크기를 모른 채 포인터만 받아요. 그런데 해제하려는 메모리의 크기를 이미 알고 있다면, 그 정보를 함께 넘겨 해제할 수 있는 게 free_sized입니다. 구현에 따라 더 효율적으로 해제할 수 있는 여지를 주는 함수예요.

출처: cppreference — free_sized

본문

free_sized는 이전에 malloc(), calloc(), 또는 realloc()(단 aligned_alloc()은 제외)이 할당한 공간을 해제해요.

문법

#include <stdlib.h>

void free_sized( void *ptr, size_t size );  // (C23부터)

설명

free_sizedfree_* 계열이 공유하는 스레드 안전성 규칙을 따릅니다. 인자를 통해 보이는 메모리 위치만 접근하는 것처럼 동작하고, 한 영역의 메모리를 해제하는 free_sized 호출은 같은 영역이나 그 일부를 할당하는 이후의 어떤 할당 함수 호출과도 동기화됩니다.

참고: cppreference 원문에는 이 함수의 설명 문단이 "free_* 계열끼리 문구를 공유하라"는 미완성(reason) 상태로 남아 있어요. 실제 동작은 free의 "크기를 아는 버전"으로 이해하면 됩니다.

매개변수

매개변수 설명
ptr 해제할 메모리를 가리키는 포인터
size 이전에 할당 함수에 넘겼던 메모리 크기

반환값

없음.

가능한 구현

표준은 구현을 강제하진 않지만, 크기 인자를 그냥 무시하고 free를 호출하는 형태가 보통의 구현 예시예요.

void free_sized(void *ptr, size_t /*size*/)
{
    free(ptr);
}

예시

포인터 벡터(동적 배열)를 만들고, 해제할 때 free_sized로 크기를 함께 넘기는 예시예요.

#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>

typedef struct
{
    size_t size;              // current number of elements
    size_t capacity;          // reserved number of elements
    void **data;
} PtrVector;

PtrVector vector_create(size_t initial_capacity)
{
    PtrVector ret = {
        .capacity = initial_capacity,
        .data = (void**)malloc(initial_capacity * sizeof(void*))
    };
    return ret;
}

void vector_delete(PtrVector *self)
{
    free_sized(self->data, self->capacity * sizeof(void*));
}

void vector_push_back(PtrVector *self, void *value)
{
    if (self->size == self->capacity)
    {
        self->capacity *= 2;
        self->data = (void**)realloc(self->data, self->capacity * sizeof(void*));
    }
    self->data[self->size++] = value;
}

int main()
{
    int data = 42;
    float pi = 3.141592f;

    PtrVector v = vector_create(8);
    vector_push_back(&v, &data);
    vector_push_back(&v, &pi);

    printf("data[0] = %i\n", *(int*)v.data[0]);
    printf("data[1] = %f\n", *(float*)v.data[1]);

    vector_delete(&v);
}

출력:

data[0] = 42
data[1] = 3.141592

용량(capacity)은 항상 알고 있으니, 해제할 때 그 값을 그대로 size로 넘겨 free_sized를 호출하는 흐름을 눈여겨보세요.

더 알아보기

  • free — 이전에 할당한 메모리를 해제해요.
  • free_aligned_sized — 크기와 정렬이 지정된, 이전에 할당한 메모리를 해제해요 (C23).
  • malloc — 메모리를 할당해요.
  • cppreference의 free_sized 원문에서 표준 항목별 세부 규칙을 더 확인할 수 있어요.