Namespaces
Variants

std::allocator<T>::allocate

ja.cppreference.net より
 
 
メモリ管理ライブラリ
アロケータ
メモリリソース
未初期化ストレージ (C++20まで)
ガベージコレクタサポート (C++23まで)
 
 
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以降)
翻訳のポイント: - HTMLタグ、属性、コードブロックは完全に保持 - C++固有の用語(std::bad_array_new_length, std::numeric_limits, std::size_t, sizeofなど)は翻訳せず - 「Throws」を「をスローする」と自然な日本語に翻訳 - 条件文を日本語の自然な語順に調整(「if ...」→「...の場合」) - 「(since C++11)」を「(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メンバー関数)