std::allocator<T>::allocate
pointer allocate( size_type n, const void* hint = 0 );
|
(1) | (C++17まで) |
T* allocate( std::size_t n, const void* hint );
|
(C++17以降) (C++20で削除) |
|
T* allocate( std::size_t n );
|
(2) | (C++17以降) (C++20まで) |
constexpr T* allocate( std::size_t n );
|
(C++20以降) | |
n * sizeof(T) バイトの未初期化ストレージを割り当てるには、::operator new(std::size_t) または ::operator new(std::size_t, std::align_val_t)(C++17以降) を呼び出しますが、この関数がいつどのように呼び出されるかは未規定です。ポインタ hint は参照の局所性を提供するために使用できます。実装でサポートされている場合、アロケータは新しいメモリブロックを hint のできるだけ近くに割り当てようとします。
次に、この関数はストレージ内に T[n] 型の配列を作成し、そのライフタイムを開始しますが、要素のライフタイムは開始しません。
T が 不完全型 である場合、この関数の使用は ill-formed です。
|
この関数を定数式で使用するには、割り当てられたストレージを同じ式の評価内で解放する必要があります。 |
(C++20以降) |
パラメータ
| n | - | ストレージを割り当てるオブジェクトの数 |
| hint | - | 近傍メモリ位置へのポインタ |
戻り値
まだ構築されていない
n
個の
T
型オブジェクトの配列の最初の要素へのポインタ。
例外
|
std::bad_array_new_length をスローする( std:: numeric_limits < std:: size_t > :: max ( ) / sizeof ( T ) < n の場合) |
(C++11以降) |
確保に失敗した場合は std::bad_alloc をスローします。
注記
「いつ、どのように行われるかは未規定」という文言により、標準ライブラリのコンテナが行う
ヒープ確保の結合や最適化
が可能となります。これは
::operator new
の直接呼び出しでは許可されていない最適化です。例えば、libc++ではこの実装が行われています (
[1]
および
[2]
)。
allocate()を呼び出した後、要素の構築前には、
T*のポインタ演算は割り当てられた配列内で well-defined ですが、要素にアクセスした場合の動作は未定義です。
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 578 | C++98 |
hint
は
0
または
allocate()
から返され、
deallocate()
に
まだ渡されていないポインタであることが要求された |
要求されない |
| LWG 3190 | C++11 |
allocate()
が誤ったサイズのストレージを割り当てる可能性があった
|
代わりに std::bad_array_new_length をスローする |
関連項目
|
[static]
|
アロケータを使用して未初期化のストレージを割り当てる
(
std::allocator_traits<Alloc>
のpublic staticメンバー関数)
|