std::allocator

< cpp‎ | memory
 
 
动态内存管理
智能指针
(C++11)
(C++11)
(C++11)
(C++17 前)
(C++11)
分配器
allocator
内存资源
未初始化存储
未初始化内存算法
有制约的未初始化内存算法
垃圾收集支持
杂项
(C++20)
(C++11)
(C++11)
C 库
低层内存管理
 
 
定义于头文件 <memory>
template< class T >
struct allocator;
(1)
template<>
struct allocator<void>;
(2) (C++17 中弃用)
(C++20 中移除)

std::allocator 类模板是所有标准库容器所用的默认分配器 (Allocator) ,若不提供用户指定的分配器。默认分配器无状态,即任何给定的 allocator 实例可交换、比较相等,且能解分配同一 allocator 类型的任何其他实例所分配的内存。

void 的显式特化缺少成员 typedef referenceconst_referencesize_typedifference_type 。此特化不声明成员函数。

(C++20 前)
所有自定义分配器必须也无状态。 (C++11 前)
自定义分配器可以含有状态。每个容器或其他具分配器对象存储一个提供的分配器实例,并通过 std::allocator_traits 控制分配器替换。 (C++11 起)
默认分配器满足分配器完整性要求 (C++17 起)

成员类型

 
类型 定义
value_type T
pointer (C++17 中弃用)(C++20 中移除) T*
const_pointer (C++17 中弃用)(C++20 中移除) const T*
reference (C++17 中弃用)(C++20 中移除) T&
const_reference (C++17 中弃用)(C++20 中移除) const T&
size_type std::size_t
difference_type std::ptrdiff_t
propagate_on_container_move_assignment(C++14) std::true_type
rebind (C++17 中弃用)(C++20 中移除) template< class U > struct rebind { typedef allocator<U> other; };
is_always_equal(C++17) std::true_type

成员函数

创建新的 allocator 实例
(公开成员函数)
析构 allocator 实例
(公开成员函数)
(C++17 中弃用)(C++20 中移除)
获得对象的地址,即使重载了 operator&
(公开成员函数)
分配未初始化的存储
(公开成员函数)
解分配存储
(公开成员函数)
(C++17 中弃用)(C++20 中移除)
返回最大的受支持分配大小
(公开成员函数)
(C++17 中弃用)(C++20 中移除)
在分配的存储构造对象
(公开成员函数)
(C++17 中弃用)(C++20 中移除)
析构在已分配存储中的对象
(公开成员函数)

非成员函数

(C++20 中移除)
比较两个分配器实例
(公开成员函数)

注意

成员模板 rebind 提供获得不同类型的 allocator 的方式。例如,

std::list<T, A> 用分配器 A::rebind<Node<T>>::other 分配某个内部类型 Node<T> 结点 (C++11 前)
std::list<T, A> 用分配器 std::allocator_traits<A>::rebind_alloc<Node<T>> 分配某个内部类型 Node<T> 结点,这用 A::rebind<Node<T>>::other 实现,若 A 是 std::allocator (C++11 起)

示例

#include <memory>
#include <iostream>
#include <string>
 
int main()
{
    std::allocator<int> a1;   // int 的默认分配器
    int* a = a1.allocate(1);  // 一个 int 的空间
    a1.construct(a, 7);       // 构造 int
    std::cout << a[0] << '\n';
    a1.deallocate(a, 1);      // 解分配一个 int 的空间
 
    // string 的默认分配器
    std::allocator<std::string> a2;
 
    // 同上,但以 a1 的重绑定获取
    decltype(a1)::rebind<std::string>::other a2_1;
 
    // 同上,但通过 allocator_traits 由类型 a1 的重绑定获取
    std::allocator_traits<decltype(a1)>::rebind_alloc<std::string> a2_2;
 
    std::string* s = a2.allocate(2); // 2 个 string 的空间
 
    a2.construct(s, "foo");
    a2.construct(s + 1, "bar");
 
    std::cout << s[0] << ' ' << s[1] << '\n';
 
    a2.destroy(s);
    a2.destroy(s + 1);
    a2.deallocate(s, 2);
}

输出:

7
foo bar

参阅

提供关于分配器类型的信息
(类模板)
为多级容器实现的多级分配器
(类模板)
检查指定的类型是否支持使用分配器的构造
(类模板)