std::allocator<T>::allocate
// 2)
[[nodiscard]] constexpr T* allocate( std::size_t n );
// 1)
T* allocate( std::size_t n, const void* hint );
// 2)
T* allocate( std::size_t n );
// 1)
pointer allocate( size_type n, const void* hint = 0 );
通过调用 ::operator new(std::size_t)
或 ::operator new(std::size_t, std::align_val_t)
(自 C++17 起) 分配 n * sizeof(T)
字节的未初始化存储,但未指定何时以及如何调用此函数。指针提示可用于提供引用的局部性:如果实现支持分配器,它将尝试将新内存块分配到尽可能靠近提示的位置。
然后,此函数在该存储中创建一个类型为 T[n]
的数组并启动其生命周期,但不会启动其任何元素的生命周期。
如果 T
是 不完整类型,则使用此函数是格式错误的。
参数
n
- 要分配存储的对象数量 hint
- 指向附近内存位置的指针
返回值
指向一个由 n
个 T
类型对象组成的数组的第一个元素的指针,这些元素尚未被构造。
异常
如果 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++ 标准。
DR | 应用于 | 发布时的行为 | 正确行为 |
---|---|---|---|
LWG 578 | C++98 | 提示被要求是 0 或先前从 allocate() 返回但尚未传递给 deallocate() 的指针 | 不要求 |
LWG 3190 | C++11 | allocate() 可能会分配错误大小的存储 | 抛出 std::bad_array_new_length 代替 |