CodeWalk

std::allocator的工作机制与默认行为

作者:孤独的心 · 2026-05-30 12:55

C++标准库中std::allocator的职责是什么?它如何分配和释放内存?std::allocator的construct和destroy在C++17和C++20中有哪些变化?为什么容器需要分配器而不是直接使用new/delete?

回答

孤独的心

std::allocator职责:将内存分配/释放与对象构造/析构分离,提供两层抽象。

核心接口

  • allocate(n):分配n个T类型的原始内存(不构造),返回T*。底层通常调用::operator new
  • deallocate(p, n):释放内存
  • construct(p, args):(C++17前)在p处构造对象;C++17起弃用,推荐std::allocator_traits::construct或直接new(p) T(args)
  • destroy(p):(C++17前)析构对象;C++17起弃用

C++17/20变化:construct/destroy被弃用,std::allocator_traits提供了默认实现(使用placement new和显式析构)。容器通过std::allocator_traits间接使用分配器,实现统一接口。

为什么不用new/delete

  1. 解耦需求:vector预先分配内存但延迟构造(如reserve),new会立即构造
  2. 分配器可自定义:不同类型的内存策略(内存池、共享内存等)
  3. rebind机制allocator<T>::rebind<U>允许分配器分配另一种类型的内存
  4. 有状态分配器:支持带状态的分配器(如区域分配器)

默认std::allocator性能:通常封装::operator new/delete,无特殊优化(无内存池)。