名前空間
変種
操作

free_sized

From cppreference.com
ヘッダー <stdlib.h> で定義
void free_sized( void* ptr, size_t size );
(C23以降)

malloc()calloc()、またはrealloc()(ただしaligned_alloc()ではない)によって以前に割り当てられた領域を解放します。

free_sized はスレッドセーフです。引数を通じて可視なメモリ位置のみにアクセスし、静的ストレージにはアクセスしないかのように動作します。

free_sized によるメモリ領域の解放呼び出しは、そのメモリ領域の同じ部分または一部を割り当てる後続の任意の割り当て関数呼び出しと *同期* します。この同期は、解放関数によるメモリへのアクセス後、および割り当て関数によるメモリへのアクセス前に行われます。個々のメモリ領域を操作するすべての割り当ておよび解放関数の単一の全体的な順序が存在します。

目次

[編集] パラメータ

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;     // 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

[編集] 参考文献

  • C23標準 (ISO/IEC 9899:2024)
  • 7.24.3.4 The free_sized function (p: 365-366)

[編集] 関連項目

以前に割り当てられたメモリを解放する
(関数) [編集]
以前に割り当てられたサイズとアライメントのメモリを解放する
(関数) [編集]
メモリを割り当てる
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)