跳到主要内容

std::allocator<T>::allocate

自 C++20 起
// 2)
[[nodiscard]] constexpr T* allocate( std::size_t n );
自 C++17 起,C++20 中已移除
// 1)
T* allocate( std::size_t n, const void* hint );
// 2)
T* allocate( std::size_t n );
直到 C++17
// 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不完整类型,则使用此函数是格式错误的。

为了在常量表达式中使用此函数,必须在同一表达式的求值过程中释放分配的存储。 (自 C++20 起)

参数

n - 要分配存储的对象数量 hint - 指向附近内存位置的指针

返回值

指向一个由 nT 类型对象组成的数组的第一个元素的指针,这些元素尚未被构造。

异常

 如果 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 578C++98提示被要求是 0 或先前从 allocate() 返回但尚未传递给 deallocate() 的指针不要求
LWG 3190C++11allocate() 可能会分配错误大小的存储抛出 std::bad_array_new_length 代替

std::allocator<T>::allocate

自 C++20 起
// 2)
[[nodiscard]] constexpr T* allocate( std::size_t n );
自 C++17 起,C++20 中已移除
// 1)
T* allocate( std::size_t n, const void* hint );
// 2)
T* allocate( std::size_t n );
直到 C++17
// 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不完整类型,则使用此函数是格式错误的。

为了在常量表达式中使用此函数,必须在同一表达式的求值过程中释放分配的存储。 (自 C++20 起)

参数

n - 要分配存储的对象数量 hint - 指向附近内存位置的指针

返回值

指向一个由 nT 类型对象组成的数组的第一个元素的指针,这些元素尚未被构造。

异常

 如果 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 578C++98提示被要求是 0 或先前从 allocate() 返回但尚未传递给 deallocate() 的指针不要求
LWG 3190C++11allocate() 可能会分配错误大小的存储抛出 std::bad_array_new_length 代替