free_sized
From cppreference.net
|
ヘッダーで定義
<stdlib.h>
|
||
|
void
free_sized
(
void
*
ptr,
size_t
size
)
;
|
(C23以降) | |
malloc() 、 calloc() または realloc() によって以前に割り当てられた領域を解放します (ただし aligned_alloc() は除く)。
|
このセクションは不完全です
理由: `free_*` ファミリー間での文言共有 |
free_sized
はスレッドセーフです:引数を通じてアクセス可能なメモリ位置のみにアクセスし、静的ストレージにはアクセスしないかのように振る舞います。
free_sized
への呼び出しは、メモリ領域を解放し、
synchronizes-with
同じメモリ領域全体または一部を割り当てる後続の割り当て関数の呼び出しと同期します。この同期は、解放関数によるメモリへのアクセス後、かつ割り当て関数によるメモリへのアクセス前に発生します。各特定のメモリ領域に対して動作する全ての割り当て関数と解放関数には、単一の全順序が存在します。
目次 |
パラメータ
| ptr | - | 解放するメモリへのポインタ |
| size | - | 以前に割り当て関数に渡されたメモリサイズ |
戻り値
(なし)
注記
| このセクションは不完全です |
実装例
例
このコードを実行
#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)
関連項目
|
以前に割り当てられたメモリを解放する
(関数) |
|
|
(C23)
|
以前に割り当てられたサイズ指定およびアラインされたメモリを解放する
(関数) |
|
メモリを割り当てる
(関数) |