std::allocator<T>::allocate

出自cppreference.com
 
 
內存管理庫
(僅用於闡述*)
分配器
未初始化內存算法
受約束的未初始化內存算法
內存資源
未初始化存儲 (C++20 前)
(C++17 棄用)
(C++17 棄用)

垃圾收集器支持 (C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(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 移除)
T* allocate( std::size_t n );
(2) (C++17 起)
(C++20 前)
constexpr T* allocate( std::size_t n );
(C++20 起)

調用 ::operator new(std::size_t) ::operator new(std::size_t, std::align_val_t) (C++17 起)分配 n * sizeof(T) 字節的未初始化存儲,但何時及如何調用此函數是未指定的。指針 hint 可用於提供引用的局部性:如果實現支持,那麼 allocator 會試圖分配儘可能接近 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> 的公開靜態成員函數) [編輯]