Namespaces
Variants

std:: free

From cppreference.net
< cpp ‎ | memory ‎ | c
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
Definiert in Header <cstdlib>
void free ( void * ptr ) ;

Gibt den zuvor durch std::malloc , std::calloc , std::aligned_alloc (since C++17) oder std::realloc allokierten Speicher frei.

Wenn ptr ein Nullzeiger ist, tut die Funktion nichts.

Das Verhalten ist undefiniert, wenn der Wert von ptr nicht einem früher von std::malloc , std::calloc , std::aligned_alloc (since C++17) oder std::realloc zurückgegebenen Wert entspricht.

Das Verhalten ist undefiniert, wenn der Speicherbereich, auf den ptr verweist, bereits freigegeben wurde, das heißt, std::free oder std::realloc bereits mit ptr als Argument aufgerufen wurde und keine Aufrufe von std::malloc , std::calloc , std::aligned_alloc (since C++17) oder std::realloc zu einem Zeiger geführt haben, der gleich ptr ist danach.

Das Verhalten ist undefiniert, wenn nachdem std::free zurückgekehrt ist, über den Zeiger ptr zugegriffen wird (es sei denn, eine andere Allokationsfunktion hat zufällig zu einem Zeigerwert geführt, der gleich ptr ist).

Die folgenden Funktionen müssen thread-sicher sein:

Aufrufe dieser Funktionen, die eine bestimmte Speichereinheit allozieren oder deallozieren, erfolgen in einer einzigen Gesamtordnung, und jeder solche Deallokationsaufruf happens-before dem nächsten Allokationsaufruf (falls vorhanden) in dieser Ordnung.

(seit C++11)

Inhaltsverzeichnis

Parameter

ptr - Zeiger auf den freizugebenden Speicher

Rückgabewert

(keine)

Hinweise

Die Funktion akzeptiert (und macht 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 std::free übergeben werden.

Beispiel

#include <cstdlib>
int main()
{
    int* p1 = (int*)std::malloc(10 * sizeof *p1);
    std::free(p1); // jeder allokierte Zeiger muss freigegeben werden
    int* p2 = (int*)std::calloc(10, sizeof *p2);
    int* p3 = (int*)std::realloc(p2, 1000 * sizeof *p3);
    if (!p3) // p3 null bedeutet, dass realloc fehlgeschlagen ist und p2 freigegeben werden muss.
        std::free(p2);
    std::free(p3); // p3 kann unabhängig davon freigegeben werden, ob es null ist oder nicht.
}

Siehe auch