std::memory_resource是C++17引入的多态内存资源抽象基类,定义allocate、deallocate和is_equal三个纯虚函数,支持插拔式切换分配策略;标准库提供new_delete_resource、pool_resource、monotonic_buffer_resource等实现,需通过std::pmr::polymorphic_allocator与容器配合使用。

std::memory_resource 是 C++17 引入的 Polymorphic Memory Resources(PMR) 机制的核心抽象类,它提供了一套统一接口,用于封装**可替换的、多态的内存分配与释放行为**。简单说,它让你能“插拔式”地切换内存分配策略,而不改业务代码。
它不是具体分配器,而是一个接口规范
std::memory_resource 是一个纯虚基类,只定义了三个关键成员函数:
- allocate(size_t bytes, size_t alignment):按指定大小和对齐要求分配内存
- deallocate(void* p, size_t bytes, size_t alignment):释放之前通过该 resource 分配的内存
- is_equal(const memory_resource& other) const noexcept:判断两个 resource 是否逻辑等价(用于避免跨 resource 误释放)
你不能直接实例化它,但可以继承它,实现自己的分配逻辑——比如基于栈、池、共享内存或跟踪内存泄漏的调试资源。
标准库提供了几个现成实现
C++17 标准在
立即学习“C++免费学习笔记(深入)”;
- std::pmr::new_delete_resource():底层调用 new/delete,是默认全局 resource
- std::pmr::null_memory_resource():分配必失败,适合测试或禁用分配场景
- std::pmr::synchronized_pool_resource / std::pmr::unsynchronized_pool_resource:基于内存池,适合高频小对象分配,减少堆碎片
- std::pmr::monotonic_buffer_resource:单向增长缓冲区(类似 arena),分配快、不支持单独释放,适合短生命周期批量对象(如一次请求处理)
怎么用?靠 std::pmr::polymorphic_allocator
std::memory_resource 本身不直接用于容器,而是通过 std::pmr::polymorphic_allocator
std::pmr::monotonic_buffer_resource pool{1024};
std::pmr::vector vec{&pool}; // 使用 pool 分配内部存储
vec.push_back(1);
vec.push_back(2); // 内存从 pool 中连续分配
// pool 析构时自动回收全部内存,无需逐个 delete
所有支持 PMR 的标准容器(vector、string、map 等)都有带 pmr::polymorphic_allocator 的构造重载,传入 resource 或其指针即可。
关键注意事项
- resource 的生命周期必须长于使用它的容器;否则访问已释放内存会导致未定义行为
- 同一个容器的所有内存操作(包括内部临时分配)都走同一个 resource,但不同容器可独立配置
- std::pmr::polymorphic_allocator 是模板类,但内部不依赖 T 类型——它只把 T 的 size 和 alignment 传给 resource,因此可安全用于异构容器场景
- is_equal() 的实现决定是否允许 move 或 swap 容器:若两个容器的 allocator 所持 resource is_equal() 为 true,swap 才是无拷贝的
基本上就这些。PMR 不复杂,但容易忽略 resource 生命周期和 is_equal 的语义——写自定义 resource 时这两点最关键。











