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