Namespaces
Variants

free_sized

From cppreference.net
헤더 파일에 정의됨 <stdlib.h>
void free_sized ( void * ptr, size_t size ) ;
(C23 이후)

malloc() , calloc() , 또는 realloc() (단 aligned_alloc() 은 제외)으로 이전에 할당된 공간을 해제합니다.

free_sized 는 스레드 안전합니다: 이 함수는 인자를 통해 접근 가능한 메모리 위치만 접근하는 것처럼 동작하며, 정적 저장소는 접근하지 않습니다.

free_sized 호출로 메모리 영역을 할당 해제하는 것은 동일한 메모리 영역 전체 또는 일부를 할당하는 이후의 모든 할당 함수 호출과 동기화됩니다(synchronizes-with) . 이 동기화는 할당 해제 함수에 의한 메모리 접근 이후에, 그리고 할당 함수에 의한 메모리 접근 이전에 발생합니다. 각 특정 메모리 영역에 대해 동작하는 모든 할당 및 할당 해제 함수에는 단일한 전체 순서가 존재합니다.

목차

매개변수

ptr - 할당 해제할 메모리에 대한 포인터
size - 이전에 할당 함수에 전달된 메모리 크기

반환값

(없음)

참고 사항

가능한 구현

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

예제

#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
    size_t size;     // 현재 원소 개수
    size_t capacity; // 예약된 원소 개수
    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

참조문헌

  • C23 표준 (ISO/IEC 9899:2024):
  • 7.24.3.4 free_sized 함수 (p: 365-366)

참고 항목

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