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
)
;
|
(C++17まで) | |
|
T
*
allocate
(
std::
size_t
n,
const
void
*
hint
)
;
|
(C++17から)
(非推奨) (C++20で削除) |
|
| (2) | ||
|
T
*
allocate
(
std::
size_t
n
)
;
|
(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
が
不完全型
である場合、不適格となります。
|
この関数を定数式で使用するには、割り当てられたストレージを同じ式の評価内で解放する必要があります。 |
(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メンバー関数)
|