讲师中心 微信公众号
AI工具推荐 视频效率加速

C++如何实现简易的内存使用峰值监控?(自定义new/delete钩子)

千敏小哥_5334

千敏小哥_5334

发布时间:2026-02-19 03:41:11

|

516人浏览过

|

来源于php中文网

原创

用全局 operator new/delete 拦截堆分配需在 .cpp 中定义非 inline 的 extern "C" 版本,配合原子计数统计峰值,注意异常、静态对象、多线程及 mmap 等绕过路径。

c++如何实现简易的内存使用峰值监控?(自定义new/delete钩子)

怎么用全局 operator new / delete 拦截所有堆分配

核心是替换全局的 operator new 和 operator delete,让每次堆内存申请/释放都经过你的统计逻辑。不是重载类内版本,而是提供链接期可见的全局符号——必须在 .cpp 文件里定义,不能只在头文件声明。

常见错误现象:undefined reference to 'operator new(unsigned long)' —— 说明只声明没定义,或定义被 inline 了;或者多个翻译单元重复定义引发 ODR 违规。

  • 必须用 extern "C" 链接约定包装 malloc/free 调用,避免 name mangling 干扰底层分配器
  • 不要在钩子里再调用 new(比如记录日志用 std::string),否则会递归触发自己,栈溢出或死锁
  • 考虑线程安全:简单方案加 std::atomic 计数器 + std::atomic_fetch_add,别用 std::mutex——锁里再分配内存就崩了

如何准确统计峰值而不漏掉临时对象

峰值不是“当前占用”,而是“历史最大瞬时占用”。关键在于:分配时累加、释放时减去,同时用原子操作更新峰值变量。漏统计往往发生在异常路径或静态对象析构阶段。

使用场景:程序启动后长期运行的服务、命令行工具跑完即退出、带 atexit 清理逻辑的程序——这三类行为对峰值捕获时机影响很大。

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

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 静态对象的构造函数可能在 main() 前触发 new,析构在 main() 后,必须确保钩子从程序起始就生效(避免放在某个类的 static 成员初始化里)
  • 异常抛出时若栈展开过程触发 delete(如智能指针释放),钩子必须能处理,否则峰值虚高
  • 建议在 main() 开头打一个基准快照,在 atexit 回调里输出最终峰值,而不是依赖 RAII 对象析构——后者可能晚于内存映射释放

为什么 malloc_hook 在现代 glibc 上基本失效

__malloc_hook 等系列接口在 glibc 2.34+ 已被标记为 deprecated,且默认编译时禁用;即使强制启用,也会因多线程下性能开销大而被绕过(glibc 内部改用 per-thread cache 后,很多分配根本不走 hook 路径)。

参数差异:__malloc_hook 只能拿到 size,拿不到调用栈或对齐要求;而自定义 operator new 可以接收 std::align_val_t、nothrow_t 等额外参数,更贴近真实 C++ 分配语义。

  • Clang/GCC 编译时若加了 -fsanitize=address,会直接接管 new,你的钩子会被跳过——调试时得关 ASan
  • Windows 下对应的是 _malloc_dbg,但仅限 Debug CRT;Release 版本需用 SetHeapInformation 或 ETW,和 Linux 方案不兼容

峰值监控要小心哪些隐蔽的内存来源

你拦住了 new,但程序仍可能通过其他路径悄悄吃内存:mmap/mprotect 分配的匿名页、thread_local 变量、std::string 的 small string optimization 以外的堆分配、甚至 std::vector 的 capacity 扩容策略。

性能影响:每次 new 多一次原子加法,实测在高频分配场景(如每秒百万次)下,开销约 5–10%,比 malloc_hook 稳定但不可忽略。

  • std::string、std::vector 等标准容器内部调用的是 operator new,会被捕获;但 std::string_view 或栈上 std::array 不算
  • 第三方库(如 Boost、protobuf)若显式调用 malloc 而非 new,就不会进你的钩子——得看它源码是否封装了分配器
  • 动态链接库(.so/.dll)里的 new 是否走你的钩子,取决于链接方式:static lib 没问题,shared lib 默认不共享全局 new 符号,除非用 -fvisibility=default 显式导出

最麻烦的其实是 mmap:有些 STL 实现(如 libstdc++ 的 __gnu_cxx::__pool_alloc)会在大块分配时切到 mmap,这部分完全绕过 operator new。真要全覆盖,得配合 /proc/self/maps 解析或 eBPF 抓系统调用——那就不是“简易”方案了。

热门AI工具

更多
墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

相关专题

更多
string转int
string转int

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

7219

2023.08.02

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

379

2026.04.23

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3228

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

5329

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3869

2025.12.29

java接口相关教程
java接口相关教程

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

486

2026.01.19

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6707

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2768

2023.08.10

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn