跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

c++如何实现一个简单的内存泄漏检测工具_c++重载new/delete操作符【项目】

C++内存泄漏检测工具通过重载全局new/delete操作符,记录分配地址、大小及文件行号,程序退出时报告未释放内存;需线程安全存储、覆盖数组操作符、避免递归分配,并可选栈回溯增强定位。 在 C++ 中实现一个简单的内存泄漏检测工具,核心思路是:**重载全局
new
delete
操作符,记录每次分配/释放的地址、大小、调用位置(文件+行号),程序退出前遍历未匹配的分配,打印泄漏信息。** 重载全局 new/delete 记录分配信息 通过重载
::operator new
::operator delete
,拦截所有堆内存操作。关键点: 使用
__FILE__
__LINE__
捕获调用位置(可封装为宏) 用线程安全的容器(如
std::map
+
std::mutex
)存储分配记录:地址 → {size, file, line}
new
分配成功后,插入记录;
delete
释放前,从容器中移除对应地址 注意重载
operator new[]
/
operator delete[]
,否则数组分配会漏检 添加调试信息和栈回溯(可选增强) 仅靠文件行号有时定位困难,可进一步提升: 用
backtrace()
(Linux)或
CaptureStackBackTrace()
(Windows)获取调用栈 结合
addr2line
或 PDB 解析符号,把地址转成函数名(需编译带调试信息) 对频繁分配的 热点 ,可加计数器或按调用栈聚合统计 程序退出时报告未释放内存 利用 RAII 或 atexit 注册清理函数: Trae win Trae Windows 官方版本现已全面支持 Win10 和 Win11 系统(64位)。国内开发者可直接访问 Trae 中文官网(trae.cn 或 trae.com.cn),一键下载官方正版 .exe 安装包,享受国内直连的高速稳定体验。安装过程极其简便,双击即可运行,并支持一键无缝导入 VS Code 或 Cursor 的原有主题、快捷键及插件配置。登录支持手机号、微信或稀土掘金账号。内置免费的豆包与 DeepSeek 等顶级大模型,让你开箱即用,轻松开启高效的 AI 智能编程之旅。 下载 立即学习 “ C++免费学习笔记(深入) ”; 在
main
返回前或
atexit
回调中遍历剩余记录 按 size 降序或按 file/line 分组输出,便于聚焦大块或高频泄漏点 示例输出:
Leak #1: 1024 bytes at 0x7f8b4c0012a0 (main.cpp:42)
可导出为 JSON 或文本,供脚本后续分析 注意事项与限制 这类工具轻量但有边界,使用前需清楚: 不拦截 STL 容器内部的分配(除非也重载其使用的分配器) 静态对象的全局 new 可能早于记录器初始化,建议在
main
开头就启用 多线程下必须加锁,否则 map 操作非线程安全 避免在重载的
new
中再触发 new(如 log 字符串构造),防止递归崩溃 基本上就这些。它不是 Valgrind 那样的全功能检测器,但足够帮你快速发现明显泄漏,尤其适合嵌入式或受限环境下的自检。

相关文章