命名空间
变体
操作

std::allocator

来自 cppreference.cn
< cpp‎ | 内存
 
 
内存管理库
(仅作说明*)
未初始化内存算法
(C++17)
(C++17)
(C++17)
受约束的未初始化
内存算法
C 库

分配器
allocator
内存资源
垃圾回收支持
(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*)
显式生命周期管理
 
 
定义于头文件 <memory>
template< class T >
struct allocator;
(1)
template<>
struct allocator<void>;
(2) (C++17 中已弃用)
(C++20 中移除)

std::allocator 类模板是所有标准库容器在未提供用户指定分配器时使用的默认 Allocator。默认分配器是无状态的,即给定分配器的所有实例都是可互换的,比较相等,并且可以释放由同一分配器类型的任何其他实例分配的内存。

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

(C++20 前)

默认分配器满足分配器完整性要求

(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++11) std::true_type
rebind (C++17 中已弃用)(C++20 中已移除) template< class U >

struct rebind
{
    typedef allocator<U> other;
};

is_always_equal (C++11)(C++23 中已弃用)(C++26 中已移除) std::true_type

[编辑] 成员函数

创建一个新的分配器实例
(公共成员函数) [编辑]
销毁分配器实例
(公共成员函数) [编辑]
(C++20 前)
获取对象的地址,即使 operator& 被重载
(公共成员函数) [编辑]
分配未初始化的存储
(公共成员函数) [编辑]
分配至少与请求大小一样大的未初始化存储
(公共成员函数) [编辑]
释放存储
(公共成员函数) [编辑]
(C++20 前)
返回支持的最大分配大小
(公共成员函数) [编辑]
(C++20 前)
在已分配的存储中构造对象
(公共成员函数) [编辑]
(C++20 前)
在已分配的存储中销毁对象
(公共成员函数) [编辑]

[编辑] 非成员函数

(在 C++20 中移除)
比较两个分配器实例
(公共成员函数) [编辑]

[编辑] 注意

成员模板类 rebind 提供了一种获取不同类型的分配器的方法。例如,std::list<T, A> 使用分配器 A::rebind<Node<T>>::other(直到 C++11)std::allocator_traits<A>::rebind_alloc<Node<T>> 分配某种内部类型 Node<T> 的节点,如果 A 是 std::allocator,则它根据 A::rebind<Node<T>>::other 实现(C++11 起)

成员类型 is_always_equal 已通过 LWG issue 3170 弃用,因为它默认将从 std::allocator 派生的自定义分配器视为始终相等。std::allocator_traits<std::allocator<T>>::is_always_equal 未被弃用,其成员常量 value 对于任何 T 都为 true

[编辑] 示例

#include <iostream>
#include <memory>
#include <string>
 
int main()
{
    // default allocator for ints
    std::allocator<int> alloc1;
 
    // demonstrating the few directly usable members
    static_assert(std::is_same_v<int, decltype(alloc1)::value_type>);
    int* p1 = alloc1.allocate(1); // space for one int
    alloc1.deallocate(p1, 1);     // and it is gone
 
    // Even those can be used through traits though, so no need
    using traits_t1 = std::allocator_traits<decltype(alloc1)>; // The matching trait
    p1 = traits_t1::allocate(alloc1, 1);
    traits_t1::construct(alloc1, p1, 7);  // construct the int
    std::cout << *p1 << '\n';
    traits_t1::deallocate(alloc1, p1, 1); // deallocate space for one int
 
    // default allocator for strings
    std::allocator<std::string> alloc2;
    // matching traits
    using traits_t2 = std::allocator_traits<decltype(alloc2)>;
 
    // Rebinding the allocator using the trait for strings gets the same type
    traits_t2::rebind_alloc<std::string> alloc_ = alloc2;
 
    std::string* p2 = traits_t2::allocate(alloc2, 2); // space for 2 strings
 
    traits_t2::construct(alloc2, p2, "foo");
    traits_t2::construct(alloc2, p2 + 1, "bar");
 
    std::cout << p2[0] << ' ' << p2[1] << '\n';
 
    traits_t2::destroy(alloc2, p2 + 1);
    traits_t2::destroy(alloc2, p2);
    traits_t2::deallocate(alloc2, p2, 2);
}

输出

7
foo bar

[编辑] 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 发布时的行为 正确的行为
LWG 2103 C++11 可能需要 allocator 之间冗余的比较 提供了 propagate_on_container_move_assignment
LWG 2108 C++11 无法表明 allocator 是无状态的 提供 is_always_equal

[编辑] 另请参阅

提供关于分配器类型的信息
(类模板) [编辑]
为多层容器实现多层分配器
(类模板) [编辑]
检查指定类型是否支持 uses-allocator 构造
(类模板) [编辑]