0

0

C++中如何利用std::pmr(多态分配器)实现容器间的内存池复用?(内存管理)

穿越時空

穿越時空

发布时间:2026-03-11 15:36:32

|

475人浏览过

|

来源于php中文网

原创

必须显式传入同一memory_resource*指针,如std::pmr::vector{res.get_resource()};资源对象生命周期须长于所有容器,否则导致野指针或未定义行为。

c++中如何利用std::pmr(多态分配器)实现容器间的内存池复用?(内存管理)

std::pmr::vector 怎么共享同一个 memory_resource

关键不是“怎么创建”,而是“怎么确保所有容器都用同一个 std::pmr::memory_resource*”。默认构造的 std::pmr::vector 会绑定到全局默认资源(std::pmr::new_delete_resource()),完全不复用。必须显式传入同一资源指针。

实操建议:

  • std::pmr::monotonic_buffer_resourcestd::pmr::synchronized_pool_resource 创建一个长期存活的对象(比如放在类成员或静态变量里)
  • 所有容器构造时统一传它的 get_resource() 结果,例如:std::pmr::vector<int>{res.get_resource()}</int>
  • 别用临时资源对象——比如在函数内建 monotonic_buffer_resource 然后传给 vector,出作用域后资源析构,vector 再访问就是野指针

为什么 std::pmr::string 和 std::pmr::vector 不能直接混用同一池

能混用,但前提是它们底层分配器使用的 memory_resource 确实是同一个实例。常见错误是:以为用了 std::pmr::string 就自动进了池,其实它默认仍走全局资源;或者给 string 传了池 A,vector 传了池 B 的指针(哪怕两个池类型一样、参数一样),内存也互不共享。

典型陷阱:

立即学习C++免费学习笔记(深入)”;

极品模板多语言企业网站管理系统1.2.2
极品模板多语言企业网站管理系统1.2.2

【极品模板】出品的一款功能强大、安全性高、调用简单、扩展灵活的响应式多语言企业网站管理系统。 产品主要功能如下: 01、支持多语言扩展(独立内容表,可一键复制中文版数据) 02、支持一键修改后台路径; 03、杜绝常见弱口令,内置多种参数过滤、有效防范常见XSS; 04、支持文件分片上传功能,实现大文件轻松上传; 05、支持一键获取微信公众号文章(保存文章的图片到本地服务器); 06、支持一键

下载
  • std::pmr::string s1{"hello", &pool1}std::pmr::string s2{"world", &pool2} —— 即使 pool1pool2 是相同类型且同配置,只要不是同一对象,内存就不互通
  • 字符串字面量构造(如 std::pmr::string{"hello"})不会触发 pmr 分配,走的是隐式转换到 const char*,再调用非 pmr 构造函数
  • 拷贝赋值(s1 = s2)时,若 s1s2get_allocator().resource() 不同,内部会重新分配内存,导致跨池拷贝——性能差且破坏复用意图

std::pmr::polymorphic_allocator 的 resource 生命周期谁管

它不管。std::pmr::polymorphic_allocator 是个轻量包装,只存一个 memory_resource* 指针,不持有资源对象本身。所以资源对象的生命周期必须比所有使用它的容器更长。

这意味着:

  • 资源对象不能是栈变量(除非容器也严格限定在同一作用域)
  • 如果资源是类成员,该类实例必须比所有依赖它的容器活得久;否则容器析构时可能尝试用已销毁的 resource 释放内存,触发未定义行为
  • std::pmr::synchronized_pool_resource 内部有锁和子池管理,适合多线程反复分配小对象;monotonic_buffer_resource 无锁、不可回收、只能整体释放——选错类型会导致内存泄漏或竞争,不是“能跑就行”

容器 swap 后内存还属于原池吗

是的,swap 只交换容器控制块(指针、size、capacity),不挪动元素内存。只要两个容器用的是同一个 memory_resource,swap 后它们依然从那个池分配/释放。

但要注意边界情况:

  • 如果 a 用池 A,b 用池 B,调 a.swap(b) 后,a 仍归池 A 管,b 归池 B 管——swap 不改变 allocator 绑定关系
  • std::swap(a, b)(ADL 版本)效果同上;但若误用 std::swap 的泛型版本(非特化),会触发拷贝构造+析构,引发跨池分配,极慢且危险
  • move 构造/赋值也保持原 allocator,这点和普通容器一致,但容易被忽略:move 并不“转移池”,只是转移容器状态

最易被忽略的一点:pmr 容器的 get_allocator() 返回的 polymorphic_allocator 是临时对象,不能靠它取地址来判断是否同源——得比对 alloc.resource() == other_alloc.resource() 才算真正共享。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1010

2023.08.02

resource是什么文件
resource是什么文件

Resource文件是一种特殊类型的文件,它通常用于存储应用程序或操作系统中的各种资源信息。它们在应用程序开发中起着关键作用,并在跨平台开发和国际化方面提供支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

180

2023.12.20

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

27

2025.11.27

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

562

2023.09.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1566

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

649

2023.11.24

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.1万人学习

C 教程
C 教程

共75课时 | 5.3万人学习

C++教程
C++教程

共115课时 | 21.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号