free_sized
来自 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 free_sized 函数 (p: 365-366)
[编辑] 另请参见
释放先前分配的内存 (函数) | |
(C23) |
释放先前分配的已设置大小和对齐的内存 (函数) |
分配内存 (函数) |