Namensräume
Varianten
Aktionen

std::malloc

Von cppreference.com
< cpp‎ | memory‎ | c
 
 
Speicherverwaltungsbibliothek
(nur Exposition*)
Algorithmen für uninitialisierten Speicher
(C++17)
(C++17)
(C++17)
Beschränkte uninitialisierte
Speicher-Algorithmen
C-Bibliothek
malloc

Allocatoren
Speicherressourcen
Unterstützung für Garbage Collection
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
Uninitialisierter Speicher
Explizites Lebenszeitmanagement
 
Definiert in Header <cstdlib>
void* malloc( std::size_t size );

Allokiert size Bytes uninitialisierten Speicherplatz.

Wenn die Allokation erfolgreich ist, wird ein Zeiger auf das niedrigste (erste) Byte im allokierten Speicherblock zurückgegeben, der für jeden Skalartyp geeignet ausgerichtet ist (mindestens so streng wie std::max_align_t) (implizites Erstellen von Objekten im Zielbereich).

Wenn size null ist, ist das Verhalten implementierungsabhängig (es kann ein Nullzeiger zurückgegeben werden oder ein Zeiger, der nicht zum Zugriff auf Speicher verwendet werden darf, aber an std::free übergeben werden muss).

Die folgenden Funktionen sind Thread-sicher erforderlich

Aufrufe dieser Funktionen, die eine bestimmte Speichereinheit zuweisen oder freigeben, erfolgen in einer einzigen Gesamtordnung, und jeder solche Freigabeaufruf happens-before die nächste Zuweisung (falls vorhanden) in dieser Ordnung.

(seit C++11)

Inhalt

[bearbeiten] Parameter

size - Anzahl der zuzuweisenden Bytes

[bearbeiten] Rückgabewert

Bei Erfolg wird der Zeiger auf den Anfang des neu allokierten Speichers zurückgegeben. Um Speicherlecks zu vermeiden, muss der zurückgegebene Zeiger mit std::free() oder std::realloc() freigegeben werden.

Bei einem Fehler wird ein Nullzeiger zurückgegeben.

[bearbeiten] Hinweise

Diese Funktion ruft keine Konstruktoren auf und initialisiert den Speicher in keiner Weise. Es gibt keine fertigen Smart Pointer, die garantieren könnten, dass die zugehörige Deallokationsfunktion aufgerufen wird. Die bevorzugte Methode der Speicherallokation in C++ ist die Verwendung von RAII-fähigen Funktionen wie std::make_unique, std::make_shared, Containerkonstruktoren usw. und in Low-Level-Bibliothekscode new-Ausdruck.

Für das Laden großer Dateien ist die Speicherabbildung über betriebssystemspezifische Funktionen, z.B. mmap unter POSIX oder CreateFileMapping(A/W) zusammen mit MapViewOfFile unter Windows, der Allokation eines Puffers für das Lesen von Dateien vorzuziehen.

[bearbeiten] Beispiel

#include <cstdlib> 
#include <iostream>   
#include <memory>
#include <string>
 
int main() 
{
    constexpr std::size_t size = 4;
    if (auto ptr = reinterpret_cast<std::string*>(std::malloc(size * sizeof(std::string))))
    {
        try
        {
            for (std::size_t i = 0; i < size; ++i)
                std::construct_at(ptr + i, 5, 'a' + i);
            for (std::size_t i = 0; i < size; ++i)
                std::cout << "ptr[" << i << "] == " << ptr[i] << '\n';
            std::destroy_n(ptr, size);
        }
        catch (...) {}
        std::free(ptr);
    }
}

Ausgabe

p[0] == aaaaa
p[1] == bbbbb
p[2] == ccccc
p[3] == ddddd

[bearbeiten] Siehe auch

Allokationsfunktionen
(Funktion) [bearbeiten]
(veraltet in C++17)(entfernt in C++20)
ermöglicht den Zugriff auf uninitialisierten Speicher
(Funktions-Template) [edit]
C-Dokumentation für malloc