命名空间
变体
操作

std::allocator<T>::allocate

来自 cppreference.cn
< 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> 的公开静态成员函数) [编辑]