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
的调用在释放内存区域时,会与后续任何分配同一内存区域或其中部分区域的分配函数调用
同步发生
。该同步发生于释放函数对内存的所有访问完成之后,且在分配函数对内存的任何访问开始之前。对于操作特定内存区域的所有分配和释放函数,存在一个单一的全序关系。
目录 |
参数
| 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)
|
释放先前分配的具有特定大小和对齐方式的内存
(函数) |
|
分配内存
(函数) |