std::allocator
是 C++ 标准库提供的一个 内存分配器,主要用于 分配和释放原始未构造的内存。它是 STL 容器如 vector
, list
的默认内存分配机制,也可以自己手动使用来精细控制内存和对象生命周期。
一、基本用途
你可以使用 std::allocator<T>
来完成以下操作:
- 分配未初始化的内存(原始内存)
- 在指定位置构造对象
- 析构对象
- 释放内存
二、基本用法示例
#include <iostream>
#include <memory>int main() {std::allocator<int> alloc;// 1. 分配原始内存(未构造)int* p = alloc.allocate(3); // 分配 3 个 int 的空间// 2. 构造对象alloc.construct(p, 10); // p[0] = 10alloc.construct(p + 1, 20); // p[1] = 20alloc.construct(p + 2, 30); // p[2] = 30// 3. 使用for (int i = 0; i < 3; ++i) {std::cout << p[i] << " ";}std::cout << std::endl;// 4. 析构对象for (int i = 0; i < 3; ++i) {alloc.destroy(p + i);}// 5. 释放内存alloc.deallocate(p, 3);return 0;
}
三、注意事项
1. 不负责构造和析构
allocate()
仅分配内存,不调用构造函数;必须显式用 construct()
构造对象,destroy()
析构对象。
2. 不建议与 new/delete
混用
std::allocator
的内存由 allocate()
分配,必须用 deallocate()
释放;不能用 delete
。
3. C++17 后 construct()
和 destroy()
已弃用
建议使用 placement new 和显式析构 替代:
new (p) int(10); // 构造
p->~int(); // 析构
4. 可用于自定义容器或内存池
你可以继承或包装 std::allocator
来实现自己的分配器,用于 STL 容器中替换默认分配行为。
四、配合 STL 容器使用
#include <vector>
#include <memory>int main() {std::vector<int, std::allocator<int>> vec;vec.push_back(100);vec.push_back(200);for (int val : vec) {std::cout << val << std::endl;}
}
默认
vector<int>
就是使用std::allocator<int>
,显式指定可以用于更复杂的场景,比如定制内存分配策略。
五、自定义分配器(拓展用法)
你可以自定义一个分配器并传给容器:
template<typename T>
struct MyAllocator : public std::allocator<T> {T* allocate(std::size_t n) {std::cout << "Allocating " << n << " elements\n";return std::allocator<T>::allocate(n);}
};
std::vector<int, MyAllocator<int>> myVec;
myVec.push_back(42); // 会输出自定义分配信息
✅ 总结
功能 | 方法名 |
---|---|
分配内存 | allocate(size_t) |
构造对象(已弃用) | construct(ptr, args...) |
析构对象(已弃用) | destroy(ptr) |
释放内存 | deallocate(ptr, n) |
推荐用法(现代 C++):
- 使用
allocate()
+new (ptr) T(args...)
构造 - 使用
ptr->~T()
显式析构