Namespaces
Variants

free

From cppreference.net
Definiert in Header <stdlib.h>
void free ( void * ptr ) ;

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

Wenn ptr ein Nullzeiger ist, führt die Funktion keine Aktion aus.

Das Verhalten ist undefiniert, wenn der Wert von ptr nicht einem zuvor von malloc() , calloc() , realloc() , oder aligned_alloc() (seit C11) zurückgegebenen Wert entspricht.

Das Verhalten ist undefiniert, wenn der Speicherbereich, auf den ptr verweist, bereits freigegeben wurde, das heißt, free() , free_sized() , free_aligned_sized() (seit C23) oder realloc() bereits mit ptr als Argument aufgerufen wurde und keine Aufrufe von malloc() , calloc() , realloc() oder aligned_alloc() (seit C11) anschließend zu einem Zeiger gleich ptr führten.

Das Verhalten ist undefiniert, wenn nachdem free() zurückgekehrt ist, ein Zugriff über den Zeiger ptr erfolgt (es sei denn, eine andere Allokationsfunktion ergab zufällig einen Zeigerwert gleich ptr ).

free 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 , der einen Speicherbereich freigibt, synchronisiert sich mit einem Aufruf einer 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 Gesamtordnung aller Allokations- und Freigabefunktionen, die auf jeden bestimmten Speicherbereich wirken.

(seit C11)

Inhaltsverzeichnis

Parameter

ptr - Zeiger auf den freizugebenden Speicher

Rückgabewert

(keine)

Hinweise

Die Funktion akzeptiert (und tut nichts mit) den Nullzeiger, um die Menge an Sonderbehandlungen zu reduzieren. Unabhängig davon, ob die Allokation erfolgreich ist oder nicht, kann der von einer Allokationsfunktion zurückgegebene Zeiger an free() übergeben werden.

Beispiel

#include <stdlib.h>
int main(void)
{
    int *p1 = malloc(10*sizeof *p1);
    free(p1); // jeder allokierte Zeiger muss freigegeben werden
    int *p2 = calloc(10, sizeof *p2);
    int *p3 = realloc(p2, 1000*sizeof *p3);
    if(p3) // p3 nicht null bedeutet, p2 wurde durch realloc freigegeben
       free(p3);
    else // p3 null bedeutet, p2 wurde nicht freigegeben
       free(p2);
}

Referenzen

  • C23-Standard (ISO/IEC 9899:2024):
  • 7.24.3.3 Die free-Funktion (S: 365)
  • C17-Standard (ISO/IEC 9899:2018):
  • 7.22.3.3 Die free-Funktion (S. 254)
  • C11-Standard (ISO/IEC 9899:2011):
  • 7.22.3.3 Die free-Funktion (S. 348)
  • C99-Standard (ISO/IEC 9899:1999):
  • 7.20.3.2 Die free-Funktion (S. 313)
  • C89/C90-Standard (ISO/IEC 9899:1990):
  • 4.10.3.2 Die free-Funktion

Siehe auch

Speicher allozieren
(Funktion)
Gibt zuvor allokierten speichergrößengebundenen Speicher frei
(Funktion)
Gibt zuvor allokierten speichergrößengebundenen und ausgerichteten Speicher frei
(Funktion)