0

0

为什么你的C++程序内存泄露了?(Valgrind调试技巧)

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-03-14 18:13:31

|

137人浏览过

|

来源于php中文网

原创

definitely lost 是确定性内存泄露,表明指针丢失且内存不可达,需优先检查 Valgrind 报告的调用栈末行源码;still reachable 非泄露但可能暴露缓存膨胀或循环引用问题。

为什么你的c++程序内存泄露了?(valgrind调试技巧)

Valgrind 报 definitely lost 是真泄露,别急着改代码

看到 definitely lost 就说明有指针丢了、没 free/delete,而且这块内存彻底不可达了。不是误报,也不是“可能有问题”,是确定性泄露。这时候别怀疑 Valgrind,先盯死它给出的调用栈——尤其是最后一行你自己的源码位置。

常见错误现象:new 但没 deletemalloc 但没 free;异常路径绕过了清理逻辑;容器(如 std::vector)里存了裸指针却没手动释放。

  • 运行命令必须加 --leak-check=full --show-leak-kinds=definite,possible,否则默认只报 definite,漏掉潜在问题
  • 编译时加 -g,否则 Valgrind 只能显示汇编地址,找不到你写的哪一行
  • 如果程序跑完立刻退出,Valgrind 才能完整扫描;后台常驻进程得用 --tool=memcheck --time-stamp=yes 配合信号触发检查

still reachable 不算泄露,但可能是设计隐患

still reachable 意思是:内存还被某个全局/静态变量、或栈上活着的指针指着,理论上还能访问到。Valgrind 不认为这是泄露,但现实中它常暴露两类问题:全局缓存没做容量限制,或单例对象在 main 结束前没显式销毁。

使用场景:日志缓冲区、配置解析后缓存的 std::string、插件系统里注册的回调函数表。

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

  • still reachable 内存随运行时间线性增长,大概率是缓存泄漏,不是“没关系”
  • C++ 中 std::shared_ptr 循环引用也会表现为 still reachable,因为控制块还在,但对象实际已无法访问
  • Valgrind 默认不追踪 mmap 分配的大块内存(如某些 STL 实现的堆池),这类需结合 --track-origins=yes 看分配源头

valgrind --tool=memcheck --suppressions=mysupp.supp 过滤第三方库噪音

刚跑 Valgrind 就刷出几百行 Qt、Boost 或 glibc 的 still reachable,不是你的锅,是这些库内部管理策略导致的。硬看只会干扰判断。

意兔-AI漫画相机
意兔-AI漫画相机

照片变漫画手绘,做周边好物

下载

实操建议:用 --gen-suppressions=all 先生成压制规则,再挑出真正属于你代码的几条保留,其余导出到 mysupp.supp

  • 压制文件里必须包含 fun: 行匹配函数名,比如 fun:QApplication::exec,不能只压 obj:/usr/lib/x86_64-linux-gnu/libQt5Core.so.5
  • 不要直接用 --suppressions=default.supp,系统自带的压制集过时且不精准,容易漏掉你自己的问题
  • CI 流水线里加压制文件后,记得把 --error-exitcode=1 保留,确保真正泄露仍会失败

Valgrind 在 C++11 后要特别注意 std::unique_ptr 和 move 语义

Valgrind 看不到 RAII 对象的生命周期,它只跟踪 malloc/free/new/delete 调用。所以 std::unique_ptr 正常转移后,原始指针变空,Valgrind 却可能还在原地址标记“still reachable”,直到析构发生——而析构时机取决于作用域和 move 是否真正发生。

容易踩的坑:把 unique_ptr 存进容器后又用 std::move 赋值给另一个变量,原容器元素变成空,但 Valgrind 的报告可能让你误以为那块内存“丢了”。

  • 确认 move 是否生效:打印 ptr.get() == nullptr,别只信语义
  • 避免在 lambda 捕获列表里用 [ptr = std::move(ptr)] 后继续用原变量,这种写法在部分编译器下可能未定义行为,Valgrind 抓不住,但会引发崩溃
  • std::make_unique 分配的内存,Valgrind 仍会归为 new 类型,但调用栈可能只显示模板实例化路径,得往回翻几层才能看到你调用 make_unique 的那行

最麻烦的情况是泄露发生在 shared library 加载期间,或者 dlopen/dlsym 动态调用路径里——Valgrind 默认不追踪这些,得加 --trace-redir=yes 并配合 --log-file 看重定向细节。这时候调用栈经常断在 __libc_dlopen_mode,得自己顺藤摸瓜。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
视频后缀名都有哪些
视频后缀名都有哪些

视频后缀名都有avi、mpg、mpeg、rm、rmvb、flv、wmv、mov、mkv、ASF、M1V、M2V、MPE、QT、VOB、RA、RMJ、RMS、RAM、等等。更多关于视频后缀名的相关知识,详情请看本专题下面的文章,php中文网欢迎大家前来学习。

3884

2023.10.31

C++ Qt图形开发
C++ Qt图形开发

本专题专注于 C++ Qt框架在图形界面开发中的应用,系统讲解窗口设计、信号与槽机制、界面布局、事件处理、数据库连接与跨平台打包等核心技能,通过多个桌面应用项目实战,帮助学员快速掌握 Qt 框架并独立完成跨平台GUI软件的开发。

76

2025.08.15

C++ 图形界面开发基础(Qt方向)
C++ 图形界面开发基础(Qt方向)

本专题系统讲解 使用 C++ 与 Qt 进行图形界面(GUI)开发的核心技能,内容涵盖 Qt 项目结构、窗口组件、信号与槽机制、事件处理、布局管理、资源管理,以及跨平台编译与打包流程。通过多个小型桌面应用实战案例,帮助学习者掌握从界面设计到功能实现的完整 GUI 开发能力。

112

2025.12.05

string转int
string转int

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

1051

2023.08.02

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

492

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

382

2023.10.25

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

215

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

193

2025.11.08

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

热门下载

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

精品课程

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

共94课时 | 11.3万人学习

C 教程
C 教程

共75课时 | 5.4万人学习

C++教程
C++教程

共115课时 | 21.9万人学习

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

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