std::allocator<T>::allocate
出自cppreference.com
| (1) | ||
| |
(C++17 前) | |
| |
(C++17 起) (棄用) (C++20 移除) |
|
| (2) | (C++17 起) (C++20 前) |
|
| (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 個對象的數組首元素的指針,數組元素尚未構造。
異常
|
如果 |
(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> 的公開靜態成員函數)
|