std::allocator<T>:: allocate
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
|
(until C++20)
|
||||
|
allocator::allocate
|
||||
|
(C++23)
|
||||
|
(until C++20)
|
||||
|
(until C++20)
|
||||
|
(until C++20)
|
||||
| Non-member functions | ||||
|
(until C++20)
|
| (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) (entfernt in C++20) |
|
| (2) | ||
|
T
*
allocate
(
std::
size_t
n
)
;
|
(seit C++17)
(bis C++20) |
|
|
constexpr
T
*
allocate
(
std::
size_t
n
)
;
|
(seit C++20) | |
Weist n * sizeof ( T ) Bytes nicht initialisierten Speichers zu, indem :: operator new ( std:: size_t ) oder :: operator new ( std:: size_t , std:: align_val_t ) (seit C++17) aufgerufen wird, jedoch ist nicht spezifiziert, wann und wie diese Funktion aufgerufen wird. Der Zeiger hint kann verwendet werden, um Lokalität der Referenz zu bieten: Der Allokator wird, falls durch die Implementierung unterstützt, versuchen, den neuen Speicherblock so nah wie möglich an hint zu allozieren.
Dann erstellt diese Funktion ein Array vom Typ
T[n]
im Speicher und beginnt dessen Lebensdauer, startet jedoch nicht die Lebensdauer eines seiner Elemente.
Die Verwendung dieser Funktion ist fehlerhaft, wenn
T
ein
incomplete type
ist.
|
Um diese Funktion in einem konstanten Ausdruck zu verwenden, muss der allokierte Speicher innerhalb der Auswertung desselben Ausdrucks freigegeben werden. |
(since C++20) |
Inhaltsverzeichnis |
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>
)
|