std::pmr::vector 必须显式传入 memory_resource* 才能发挥pmr作用;资源生命周期需长于容器;monotonic_buffer_resource 不支持回收且分配失败返回nullptr;synchronized_pool_resource 多线程下性能差,应优先用 unsynchronized_pool_resource + tls;polymorphic_allocator 的模板参数 t 必须与元素类型严格一致。

std::pmr::vector 构造时必须显式传入 memory_resource*
不传资源,std::pmr::vector 会退化为使用全局 std::pmr::new_delete_resource(),和普通 std::vector 没区别。想用自定义策略,必须在构造时绑定资源指针。
- 错误写法:
std::pmr::vector<int> v;</int>→ 默认 new/delete,没发挥 PMR 作用 - 正确写法:
std::pmr::vector<int> v{&pool};</int>,其中pool是std::pmr::memory_resource*类型(如monotonic_buffer_resource实例的地址) - 资源生命周期必须长于容器:若
pool是栈变量,而v被 move 出作用域,后续访问将触发未定义行为 - 不能只传
polymorphic_allocator实例而不关联资源——分配器只是转发层,真正干活的是它持有的memory_resource*
monotonic_buffer_resource 分配失败不抛异常,但返回空指针
std::pmr::monotonic_buffer_resource 在缓冲区耗尽时,allocate() 直接返回 nullptr,而 STL 容器内部不会检查该指针。结果不是 std::bad_alloc,而是后续 construct() 或解引用导致崩溃,且堆栈无明确提示。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 调试时务必加防护:可包装一层,例如重写
do_allocate,在返回前插入assert(ptr != nullptr) - 它不支持
deallocate():所有内存只能随资源对象析构时一并释放,无法手动回收中间某块 - 适合场景:短期、一次性、顺序分配(如解析一帧数据、构建临时 AST),不适合需反复增删的结构
- 别指望用它做“带回收的池”——名字里的 monotonic 就是单向增长的意思
多线程下慎用 synchronized_pool_resource
std::pmr::synchronized_pool_resource 的互斥锁是全局一把,所有分配/释放请求都串行排队。高并发小对象场景下,性能反而比单线程还差 3–5 倍。
- 更实用的组合是:
std::pmr::unsynchronized_pool_resource+ 线程局部存储(TLS) - 每个线程持有一个独立的
polymorphic_allocator<int></int>,背后连各自的池实例,彻底避开锁争用 -
synchronized_pool_resource仅适合低频、跨线程共享同一池的场景(如集中写日志缓冲区),不是通用方案 - 池参数(
std::pmr::pool_options)影响显著:默认max_blocks_per_chunk = 0可能导致频繁系统调用,建议根据典型对象大小预设
polymorphic_allocator 的 T 必须与容器元素类型严格一致
模板参数 T 不是占位符,它参与 construct() 和 destroy() 的地址计算与函数调用。错配会导致未定义行为,编译期不一定报错。
- 错误示例:
std::pmr::vector<:string>{std::pmr::polymorphic_allocator<char>{&pool}}</char></:string>→construct()会在char*上调用std::string构造函数,崩溃或乱码 - 正确写法:
std::pmr::vector<:string>{std::pmr::polymorphic_allocator<:string>{&pool}}</:string></:string> - 别图省事 typedef
polymorphic_allocator<void></void>—— C++20 已废弃,且void版本无法完成对象构造 - 复用同一块内存池管理多种类型?没问题:用同一个
&pool地址,分别构造polymorphic_allocator<int></int>、polymorphic_allocator<:string></:string>即可
monotonic_buffer_resource 放在栈上,却让 pmr::vector 活过作用域,比没用 PMR 还危险。C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










