free_sized
来自cppreference.com
| 在标头 <stdlib.h> 定义
|
||
| |
(C23 起) | |
解分配之前由 malloc()、calloc() 或 realloc()(但非 aligned_alloc())分配的存储空间。
| 本节未完成 原因:share wording among `free_*` family |
free_sized 是线程安全的:它表现得如同只访问通过其参数可见的内存区域,而非任何静态存储。
解分配一块内存区域的 free_sized 调用同步于分配同一块或部分相同的内存区域的后续任何分配函数的调用。此同步出现于任何通过解分配函数所作的内存访问之后,和任何分配函数所作出的内存访问之前。所有操作每块特定内存区域的分配和解分配函数拥有单独全序。
参数
| ptr | - | 指向欲解分配内存的指针 |
| size | - | 之前传递给分配函数的内存大小 |
返回值
(无)
注解
| 本节未完成 |
可能的实现
void free_sized(void* ptr, size_t /*size*/)
{
free(ptr);
}
示例
运行此代码
#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 函数 (第 365-366 页)
参阅
| 归还之前分配的内存 (函数) | |
(C23) |
归还之前分配的指定大小和对齐的内存 (函数) |
| 分配内存 (函数) |