名稱空間
變體
操作

std::allocator<T>::allocate

來自 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不完整型別,則對此函式的使用非良構。

為了在常量表達式中使用此函式,分配的儲存必須在同一表示式的求值過程中被解分配。

(C++20 起)

目錄

[編輯] 引數

n - 要分配儲存的物件數量
hint - 指向附近記憶體位置的指標

[編輯] 返回值

指向 T 型別 n 個物件陣列的第一個元素的指標,這些物件的元素尚未被構造。

[編輯] 異常

std::numeric_limits<std::size_t>::max() / sizeof(T) < n,則丟擲 std::bad_array_new_length

(C++11 起)

若分配失敗,則丟擲 std::bad_alloc

[編輯] 注意

“何時及如何呼叫未指定”的措辭使得可以合併或最佳化掉標準庫容器進行的堆分配,即使這種最佳化對於直接呼叫 ::operator new 是不允許的。例如,libc++ 實現了這一點([1][2])。

在呼叫 allocate() 之後、構造元素之前,在分配的陣列內,T* 的指標算術是良定義的,但若訪問元素則行為未定義。

[編輯] 缺陷報告

下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
LWG 578 C++98 hint 被要求為 0 或先前從 allocate() 返回且尚未傳遞給 deallocate() 的指標
(段落已合併至上一條)
(段落已合併至上一條)
未要求
LWG 3190 C++11 allocate() 可能分配錯誤大小的儲存空間 轉而丟擲 std::bad_array_new_length

[編輯] 參閱

[靜態]
使用分配器分配未初始化的儲存
(std::allocator_traits<Alloc> 的公開靜態成員函式) [編輯]