std::malloc
| 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) | |
| (veraltet in C++17)(entfernt in C++20) |
ermöglicht den Zugriff auf uninitialisierten Speicher (Funktions-Template) |
| C-Dokumentation für malloc
| |