Namespaces
Variants

std::allocator<T>:: allocate

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(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以降)

目次

翻訳の説明: - 「Contents」を「目次」に翻訳しました - C++関連の専門用語(Parameters、Return value、Exceptions、Notes、Defect reports、See also)は原文のまま保持しました - HTMLタグ、属性、クラス名、IDなどは一切変更していません - 数値やリンクなどの書式も完全に保持しています

パラメータ

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メンバー関数)