free_sized
From cppreference.com
| ヘッダー <stdlib.h> で定義 |
||
| void free_sized( void* ptr, size_t size ); |
(C23以降) | |
malloc()、calloc()、またはrealloc()(ただしaligned_alloc()ではない)によって以前に割り当てられた領域を解放します。
| このセクションは未完成です 理由: `free_*` ファミリー間で語句を共有 |
free_sized はスレッドセーフです。引数を通じて可視なメモリ位置のみにアクセスし、静的ストレージにはアクセスしないかのように動作します。
free_sized によるメモリ領域の解放呼び出しは、そのメモリ領域の同じ部分または一部を割り当てる後続の任意の割り当て関数呼び出しと *同期* します。この同期は、解放関数によるメモリへのアクセス後、および割り当て関数によるメモリへのアクセス前に行われます。個々のメモリ領域を操作するすべての割り当ておよび解放関数の単一の全体的な順序が存在します。
目次 |
[編集] パラメータ
| ptr | - | 解放するメモリへのポインタ |
| size | - | 以前に割り当て関数に渡されたメモリのサイズ |
[編集] 戻り値
(なし)
[編集] 注意
| このセクションは未完成です |
[編集] 実装例
[編集] 例
このコードを実行
#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)
[編集] 関連項目
| 以前に割り当てられたメモリを解放する (関数) | |
| (C23) |
以前に割り当てられたサイズとアライメントのメモリを解放する (関数) |
| メモリを割り当てる (関数) |