名稱空間
變體
操作

free_sized

來自 cppreference.com
< c‎ | 記憶體
在標頭檔案 <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;     // 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)

[編輯] 另請參閱

釋放先前分配的記憶體
(函式) [編輯]
釋放之前分配的指定大小且對齊的記憶體
(函式) [編輯]
分配記憶體
(函式) [編輯]