Namensräume
Varianten
Aktionen

std::allocator<T>::allocate

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

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
 
 
(1)
pointer allocate( size_type n, const void* hint = 0 );
(bis C++17)
T* allocate( std::size_t n, const void* hint );
(seit C++17)
(veraltet)
(in C++20 entfernt)
(2)
T* allocate( std::size_t n );
(seit C++17)
(bis C++20)
constexpr T* allocate( std::size_t n );
(seit C++20)

Allokiert 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 undefiniert, wann und wie diese Funktion aufgerufen wird. Der Zeiger hint kann zur Bereitstellung der Lokalität der Referenz verwendet werden: Der Allokator versucht, den neuen Speicherblock so nah wie möglich an hint zu allokieren, sofern die Implementierung dies unterstützt.

Anschließend erstellt diese Funktion ein Array vom Typ T[n] im Speicher und startet dessen Lebensdauer, startet aber nicht die Lebensdauer von Elementen davon.

Die Verwendung dieser Funktion ist ill-formed, wenn T ein unvollständiger Typ ist.

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

(seit C++20)

Inhalt

[edit] Parameter

n - die Anzahl der Objekte, für die Speicher allokiert werden soll
hint - Zeiger auf eine nahegelegene Speicheradresse

[edit] Rückgabewert

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

[edit] Ausnahmen

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

(seit C++11)

Wirft std::bad_alloc, wenn die Allokation fehlschlägt.

[edit] Hinweise

Die Formulierung "undefiniert, wann und wie" ermöglicht es, Heap-Allokationen, die von den Standardbibliothekscontainern vorgenommen werden, zu kombinieren oder zu optimieren, obwohl solche Optimierungen für direkte Aufrufe von ::operator new nicht zulässig sind. Dies wird beispielsweise 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 wohl-definiert, das Verhalten ist jedoch undefiniert, wenn auf Elemente zugegriffen wird.

[edit] Fehlerberichte

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

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 578 C++98 hint war erforderlich, entweder 0 oder ein
Zeiger, der zuvor von allocate() zurückgegeben wurde
und noch nicht an deallocate() übergeben wurde.
nicht erforderlich.
LWG 3190 C++11 allocate() könnte Speicher mit falscher Größe allokieren. wirft stattdessen std::bad_array_new_length.

[edit] Siehe auch

[static]
alloziiert uninitialisierten Speicher unter Verwendung des Allokators
(public static member function of std::allocator_traits<Alloc>) [bearbeiten]