
std::allocator 是 C++ 标准库中默认的内存分配器模板,它封装了原始内存的申请与释放逻辑,让 STL 容器(如 vector、list、map)能与具体内存管理方式解耦。 它本身不直接操作 new/delete,而是通过 std::allocator_traits 间接调用 ::operator new 和 ::operator delete,提供类型安全、可定制、符合异常规范的内存接口。
allocator 的核心职责:分离“对象构造”与“内存分配”
STL 容器不直接 new T[] 或 delete[],而是分两步:
- 先用 allocator::allocate(n) 申请未初始化的原始内存(类似 malloc,但带 size_t 计算)
- 再用 allocator::construct(ptr, args...) 在该内存上就地构造对象(等价于 placement new)
- 析构时调用 allocator::destroy(ptr),仅调用析构函数,不释放内存
- 最后用 allocator::deallocate(ptr, n) 归还原始内存(类似 free)
这种分离让容器能支持无异常构造、自定义对齐、内存池等高级场景。
为什么默认 allocator 通常“透明”?
绝大多数情况下你无需显式写 allocator 类型——vector
立即学习“C++免费学习笔记(深入)”;
- allocate:调用 operator new(std::size_t)
- deallocate:调用 operator delete(void*, std::size_t)
- construct/destroy:分别委托给 std::construct_at / std::destroy_at(C++20 起)或 placement new / explicit destructor call
它不做内存复用、不缓存块、不记录类型信息,纯粹是薄封装,所以性能开销极小,也容易被编译器优化掉。
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~