free_sized
|
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.
|
Dieser Abschnitt ist unvollständig
Grund: Formulierung für `free_*`-Familie vereinheitlichen |
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
| Dieser Abschnitt ist unvollständig |
Mögliche Implementierung
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) |
|
|
(C23)
|
gibt zuvor allokierten ausgerichteten und dimensionierten Speicher frei
(Funktion) |
|
allokiert Speicher
(Funktion) |