`free_sized` — 크기를 아는 상태에서 메모리를 해제하는 함수
free_sized — 크기를 아는 상태에서 메모리를 해제하는 함수 (C23)
free는 해제할 메모리의 크기를 모른 채 포인터만 받아요. 그런데 해제하려는 메모리의 크기를 이미 알고 있다면, 그 정보를 함께 넘겨 해제할 수 있는 게 free_sized입니다. 구현에 따라 더 효율적으로 해제할 수 있는 여지를 주는 함수예요.
본문
free_sized는 이전에 malloc(), calloc(), 또는 realloc()(단 aligned_alloc()은 제외)이 할당한 공간을 해제해요.
문법
#include <stdlib.h>
void free_sized( void *ptr, size_t size ); // (C23부터)
설명
free_sized는 free_* 계열이 공유하는 스레드 안전성 규칙을 따릅니다. 인자를 통해 보이는 메모리 위치만 접근하는 것처럼 동작하고, 한 영역의 메모리를 해제하는 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 원문에서 표준 항목별 세부 규칙을 더 확인할 수 있어요.