Spec-Zone.ru › C

free_sized

Определено в заголовочном файле <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 (стр. 365–366)

См. также

free
освобождает ранее выделенную память
(функция)
free_aligned_sized
(C23)
освобождает ранее выделенную память заданного размера и с заданным выравниванием
(функция)
malloc
выделяет память
(функция)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/memory/free_sized

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API