Namespaces
Variants

free_sized

From cppreference.net
定义于头文件 <stdlib.h>
void free_sized ( void * ptr, size_t size ) ;
(C23 起)

释放先前由 malloc() calloc() realloc() (但不包括 aligned_alloc() )分配的空间。

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 函数 (p: 365-366)

参见

释放先前分配的内存
(函数)
释放先前分配的具有特定大小和对齐方式的内存
(函数)
分配内存
(函数)