Namespaces
Variants

std::allocator<T>::allocate

Von de.cppreference.net
 
 
Speicherverwaltungsbibliothek
Allokatoren
Speicherressourcen
Nicht initialisierter Speicher (bis C++20*))
Garbage-Collector-Unterstützung (bis C++23)
 
 
pointer allocate( size_type n, const void* hint = 0 );
(1) (bis C++17)
T* allocate( std::size_t n, const void* hint );
(seit C++17)
(entfernt in C++20)
T* allocate( std::size_t n );
(2) (seit C++17)
(bis C++20)
constexpr T* allocate( std::size_t n );
(seit C++20)

Alloziert n * sizeof(T) Bytes nicht initialisierten Speichers durch Aufruf von ::operator new(std::size_t) oder ::operator new(std::size_t, std::align_val_t)(seit C++17), aber es ist nicht spezifiziert, wann und wie diese Funktion aufgerufen wird. Der Zeiger hint kann verwendet werden, um eine räumliche Lokalität zu bieten: der Allokator, falls von der Implementierung unterstützt, wird versuchen, den neuen Speicherblock so nah wie möglich an hint.

Dann erzeugt diese Funktion ein Array vom Typ T[n] im Speicher und beginnt seine Lebensdauer, beginnt aber nicht die Lebensdauer seiner Elemente.

Die Verwendung dieser Funktion ist fehlerhaft, wenn T ein unvollständiger Typ.

Um diese Funktion in einem konstanten Ausdruck verwenden zu können, muss der allozierte Speicher innerhalb der Auswertung desselben Ausdrucks freigegeben werden.

(seit C++20)

Parameter

n - die Anzahl der Objekte, für die Speicherplatz allokiert werden soll
hint - Zeiger auf einen nahegelegenen Speicherbereich

Rückgabewert

Zeiger auf das erste Element eines Arrays von n Objekten des Typs T , deren Elemente noch nicht konstruiert wurden.

Exceptions

Wirft std::bad_array_new_length falls std:: numeric_limits < std:: size_t > :: max ( ) / sizeof ( T ) < n .

(seit C++11)

Wirft std::bad_alloc falls die Allokation fehlschlägt.

Hinweise

Die Formulierung "unspecified when and how" ermöglicht es, Heap-Allokationen zu kombinieren oder wegzuoptimieren , die von den Standardbibliothek-Containern durchgeführt werden, selbst wenn solche Optimierungen für direkte Aufrufe von ::operator new nicht erlaubt sind. Zum Beispiel wird dies von libc++ implementiert ( [1] und [2] ).

Nach dem Aufruf von allocate() und vor der Konstruktion der Elemente ist die Zeigerarithmetik von T* innerhalb des allokierten Arrays wohldefiniert, aber das Verhalten ist undefiniert, wenn auf Elemente zugegriffen wird.

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 578 C++98 hint musste entweder ​ 0 ​ oder ein
zuvor von allocate() zurückgegebener Zeiger sein,
der noch nicht an deallocate() übergeben wurde
nicht erforderlich
LWG 3190 C++11 allocate() könnte Speicher falscher Größe allozieren wirft stattdessen std::bad_array_new_length

Siehe auch

[static]
weist nicht initialisierten Speicher mit dem Allokator zu
(öffentliche statische Mitgliedsfunktion von std::allocator_traits<Alloc> )