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)

関連項目

以前に割り当てられたメモリを解放する
(関数)
以前に割り当てられたサイズ指定およびアラインされたメモリを解放する
(関数)
メモリを割り当てる
(関数)