Namespaces
Variants

free_sized

From cppreference.net
Definido en el encabezado <stdlib.h>
void free_sized ( void * ptr, size_t size ) ;
(desde C23)

Libera el espacio previamente asignado por malloc() , calloc() , o realloc() (pero no aligned_alloc() ).

free_sized es seguro para hilos: se comporta como si solo accediera a las ubicaciones de memoria visibles a través de su argumento, y no a ningún almacenamiento estático.

Una llamada a free_sized que desasigna una región de memoria se sincroniza-con una llamada a cualquier función de asignación posterior que asigne la misma o una parte de la misma región de memoria. Esta sincronización ocurre después de cualquier acceso a la memoria por parte de la función desasignadora y antes de cualquier acceso a la memoria por parte de la función de asignación. Existe un único orden total de todas las funciones de asignación y desasignación que operan sobre cada región particular de memoria.

Contenidos

Parámetros

ptr - puntero a la memoria para desasignar
size - tamaño de la memoria previamente pasado a una función de asignación

Valor de retorno

(ninguno)

Notas

Implementación posible

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

Ejemplo

#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
    size_t size;     // número actual de elementos
    size_t capacity; // número reservado de elementos
    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);
}

Salida:

data[0] = 42
data[1] = 3.141592

Referencias

  • Estándar C23 (ISO/IEC 9899:2024):
  • 7.24.3.4 La función free_sized (p: 365-366)

Véase también

desasigna memoria previamente asignada
(función)
desasigna memoria previamente asignada con tamaño y alineación específicos
(función)
asigna memoria
(función)