名前空間
変種
操作

std::allocator<T>::allocate

From cppreference.com
< cpp‎ | memory‎ | allocator
 
 
メモリ管理ライブラリ
(説明用*)
未初期化メモリのアルゴリズム
(C++17)
(C++17)
(C++17)
制約付き未初期化
メモリアルゴリズム
Cライブラリ

アロケータ
メモリリソース
ガベージコレクションのサポート
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
未初期化ストレージ
(C++20まで*)
(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不完全型である場合、この関数の使用はill-formedです。

定数式でこの関数を使用するには、確保されたストレージが同じ式の評価中に解放されている必要があります。

(C++20以降)

目次

[編集] Parameters

n - 割り当て対象のオブジェクト数
hint - 近くのメモリ位置へのポインタ

[編集] Return value

要素がまだ構築されていない T 型のオブジェクト n 個の配列の最初の要素へのポインタ。

[編集] Exceptions

std::numeric_limits::max() / sizeof(T) < n の場合、std::bad_array_new_length をスローします。

(C++11以降)

確保に失敗した場合、std::bad_alloc をスローします。

[編集] Notes

「いつ、どのように呼び出されるかは未規定」という記述により、標準ライブラリコンテナによるヒープ割り当てを結合または最適化することが可能になります。これは、直接 ::operator new を呼び出す場合には許可されていない最適化です。例えば、libc++ではこのように実装されています([1] および [2])。

allocate() を呼び出した後、要素の構築前には、割り当てられた配列内での T* のポインタ演算はwell-definedですが、要素にアクセスした場合は未定義の動作となります。

[編集] Defect reports

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 578 C++98 hint0 または
allocate() によって以前返され、まだ deallocate() に渡されていない
ポインタである必要がありました。
要求されない
LWG 3190 C++11 allocate() が間違ったサイズのストレージを確保する可能性がありました。 代わりに std::bad_array_new_length をスローします。

[編集] See also

[static]
アロケータを使用して未初期化のストレージを割り当てる
(std::allocator_traits<Alloc> の public static メンバー関数) [編集]
English 日本語 中文(简体) 中文(繁體)