Namespaces
Variants

free_sized

From cppreference.net
Definiert im Header <stdlib.h>
void free_sized ( void * ptr, size_t size ) ;
(seit C23)

Gibt den zuvor durch malloc() , calloc() oder realloc() (jedoch nicht aligned_alloc() ) allokierten Speicher frei.

free_sized ist threadsicher: Es verhält sich so, als würde es nur auf die Speicherbereiche zugreifen, die durch sein Argument sichtbar sind, und nicht auf statischen Speicher.

Ein Aufruf von free_sized , der einen Speicherbereich freigibt, synchronisiert sich mit einem Aufruf jeder nachfolgenden Allokationsfunktion, die denselben oder einen Teil desselben Speicherbereichs allokiert. Diese Synchronisation erfolgt nach jedem Zugriff auf den Speicher durch die freigebende Funktion und vor jedem Zugriff auf den Speicher durch die Allokationsfunktion. Es gibt eine einzige totale Ordnung aller Allokations- und Freigabefunktionen, die auf jeden bestimmten Speicherbereich wirken.

Inhaltsverzeichnis

Parameter

ptr - Zeiger auf den freizugebenden Speicher
size - Größe des Speichers, der zuvor an eine Allokationsfunktion übergeben wurde

Rückgabewert

(keine)

Hinweise

Mögliche Implementierung

void free_sized(void* ptr, size_t /*Größe*/)
{
    free(ptr);
}

Beispiel

#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
    size_t size;     // aktuelle Anzahl der Elemente
    size_t capacity; // reservierte Anzahl der Elemente
    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);
}

Ausgabe:

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

Referenzen

  • C23-Standard (ISO/IEC 9899:2024):
  • 7.24.3.4 Die free_sized-Funktion (S: 365-366)

Siehe auch

gibt zuvor allokierten Speicher frei
(Funktion)
gibt zuvor allokierten ausgerichteten und dimensionierten Speicher frei
(Funktion)
allokiert Speicher
(Funktion)