通八洲科技

c++中的std::memory_resource是什么_c++ C++17自定义内存分配策略【PMR】

日期:2025-12-15 00:00 / 作者:冰火之心
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 是一个纯虚基类,只定义了三个关键成员函数:

你不能直接实例化它,但可以继承它,实现自己的分配逻辑——比如基于栈、池、共享内存或跟踪内存泄漏的调试资源。

标准库提供了几个现成实现

C++17 标准在 头文件中提供了开箱即用的 concrete 类型:

怎么用?靠 std::pmr::polymorphic_allocator

std::memory_resource 本身不直接用于容器,而是通过 std::pmr::polymorphic_allocator 包装后使用。这个 allocator 持有一个 memory_resource*,所有分配/释放操作都委托给它:

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 或其指针即可。

关键注意事项

基本上就这些。PMR 不复杂,但容易忽略 resource 生命周期和 is_equal 的语义——写自定义 resource 时这两点最关键。