free_sized
来自 cppreference.cn
定义于头文件 <stdlib.h> |
||
void free_sized( void* ptr, size_t size ); |
(自 C23 起) | |
解分配先前由 malloc()、 calloc() 或 realloc() (但不是 aligned_alloc()) 分配的空间。
本节尚不完整 原因:在 `free_*` 族之间共享措辞 |
free_sized
是线程安全的:它的行为就像只访问通过其参数可见的内存位置,而不是任何静态存储。
调用 free_sized
以解分配内存区域同步于对任何后续分配函数的调用,该分配函数分配相同或部分相同的内存区域。 此同步发生在解分配函数对内存的任何访问之后,以及分配函数对内存的任何访问之前。 在每个特定内存区域上运行的所有分配和解分配函数都存在单一的总顺序。
目录 |
[edit] 参数
ptr | - | 要解分配的内存的指针 |
size | - | 先前传递给分配函数的内存大小 |
[edit] 返回值
(无)
[edit] 注解
本节尚不完整 |
[edit] 可能的实现
[edit] 示例
运行此代码
#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
[edit] 参考
- C23 标准 (ISO/IEC 9899:2024)
- 7.24.3.4 free_sized 函数 (页码: 365-366)
[edit] 参见
解分配先前分配的内存 (函数) | |
(C23) |
解分配先前分配的带大小和对齐的内存 (函数) |
分配内存 (函数) |