std::allocator<T>::allocate
| (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 wurdeund 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>) |