命名空间
变体
操作

free_sized

来自 cppreference.cn
< c‎ | memory
定义于头文件 <stdlib.h>
void free_sized( void* ptr, size_t size );
(自 C23 起)

解分配先前由 malloc()calloc()realloc() (但不是 aligned_alloc()) 分配的空间。

free_sized 是线程安全的:它的行为就像只访问通过其参数可见的内存位置,而不是任何静态存储。

调用 free_sized 以解分配内存区域同步于对任何后续分配函数的调用,该分配函数分配相同或部分相同的内存区域。 此同步发生在解分配函数对内存的任何访问之后,以及分配函数对内存的任何访问之前。 在每个特定内存区域上运行的所有分配和解分配函数都存在单一的总顺序。

目录

[edit] 参数

ptr - 要解分配的内存的指针
size - 先前传递给分配函数的内存大小

[edit] 返回值

(无)

[edit] 注解

[edit] 可能的实现

void free_sized(void* ptr, size_t /*size*/)
{
    free(ptr);
}

[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] 参见

解分配先前分配的内存
(函数) [编辑]
解分配先前分配的带大小和对齐的内存
(函数) [编辑]
分配内存
(函数) [编辑]