std::allocator<T>::allocate
來自 cppreference.com
(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> 的公開靜態成員函式) |