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

如何在Linux下用Valgrind分析c++内存泄漏? (Memcheck工具)

千杰君_2298

千杰君_2298

发布时间:2026-01-20 16:17:42

|

798人浏览过

|

来源于php中文网

原创

编译需加-g且禁用优化:g++ -g -O0确保调试信息完整、执行流清晰;Valgrind须用--leak-check=full --show-leak-kinds=all --track-origins=yes定位泄漏;definitely lost必须修复,still reachable通常非bug;避免exit()绕过析构,慎用shared_ptr防循环引用。

如何在linux下用valgrind分析c++内存泄漏? (memcheck工具)

编译时必须加 -g 且禁用优化

Valgrind 依赖调试信息定位泄漏源头,不加 -g 会导致报告里只有 ???,完全无法回溯到源码行。同时,-O2 或更高优化等级会让变量生命周期、内联、寄存器分配失真,造成误报(如把未初始化值当泄漏)或漏报(如提前释放被优化掉)。实操建议:

  • 用 g++ -g -O0 -o myapp myapp.cpp 编译,确保符号完整、执行流清晰
  • 若项目用 CMake,加 set(CMAKE_BUILD_TYPE Debug) 并确认 CMAKE_CXX_FLAGS_DEBUG 包含 -g -O0
  • 避免链接 strip 后的库;第三方库也尽量用带调试符号的版本(如 Ubuntu 的 *-dbg 包)

运行 Valgrind 时启用完整内存检查参数

默认 valgrind ./myapp 只做基础错误检测,对内存泄漏需显式开启 --leak-check=full 并配合其他关键选项。常见遗漏点:

  • --leak-check=full:显示每块泄漏内存的分配栈,缺它就只告诉你“有泄漏”,不告诉你在哪
  • --show-leak-kinds=all:覆盖 definitely lost、indirectly lost、possibly lost、still reachable 四类,尤其 possibly lost 常被忽略但可能指向悬空指针或边界越界
  • --track-origins=yes:对 Use of uninitialised value 类错误,能追溯未初始化内存的来源(代价是慢 2–3 倍,但值得)
  • 完整命令示例:
    valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --log-file=valgrind-out.txt ./myapp

区分 definitely lost 和 still reachable 的真实含义

Valgrind 报告里的分类直接决定修复优先级,但很多人误判:

linux-performance-analyzer
linux-performance-analyzer

Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。

下载
  • definitely lost:指针已丢失(比如局部指针变量出作用域,且无其他引用),内存彻底不可达 → 必须修复
  • still reachable:程序退出时仍有指针指向该内存(如全局 std::vector 缓存、单例对象成员),通常不是 bug,但若量大或持续增长,说明资源未按需释放
  • indirectly lost:父块泄漏导致子指针失效,先修父块即可,不用单独处理
  • 注意:C++ 中 std::string、std::vector 等容器内部 new 的内存,若容器本身是栈对象且未 move/转移,其析构会自动释放,不会报 leak —— 所以泄漏基本来自裸 new 未配 delete,或 new[] 配了 delete

处理 C++ RAII 与第三方库干扰

Valgrind 本身不理解 C++ 析构语义,某些 RAII 模式或库(如 Boost、Qt)会在主函数结束后才释放资源,造成假阳性。应对方式:

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

  • 在程序末尾主动调用清理逻辑,例如 Qt 中加 QApplication::processEvents(); qApp->quit();,再等几毫秒
  • 用 --suppressions=mysupp.supp 屏蔽已知良性泄漏,例如 GLIBC 的 __libc_freeres 调用前的缓存(生成模板见 valgrind --gen-suppressions=all)
  • 避免在 main() 返回前用 exit() —— 它绕过栈展开和析构,会让所有 RAII 失效,把本可自动释放的内存变成 definitely lost
  • 若用 shared_ptr 却仍泄漏,检查是否形成循环引用(如父子对象互相持 shared_ptr),此时应改用 weak_ptr 打断环
Valgrind 的 Memcheck 对裸指针管理问题极其敏感,但对现代 C++(智能指针、容器)的误报率其实很低;真正难的是从几十页报告里快速定位那个少写了一行 delete 或多写了一个 std::move 的地方——这时候 --num-callers=20 和日志文件里搜索 at 0x 对应的源码行,比任何技巧都管用。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
豆包大模型

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

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

DeepSeek

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

墨刀AI
墨刀AI Hot

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

WorkBuddy

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

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

咔片AIPPT

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

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

相关专题

更多
C++ Qt图形开发
C++ Qt图形开发

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

3862

2025.08.15

C++桌面程序开发
C++桌面程序开发

本专题聚焦 C++ 在桌面端图形界面应用开发中的实战应用,系统讲解 Qt 框架的信号与槽机制、界面布局管理、事件响应、数据交互、样式美化与多窗口应用设计等核心知识。通过实战案例(如记事本应用、数据管理工具、系统监控面板),帮助学习者掌握 从UI设计到完整桌面软件开发的C++工程化能力。

1154

2025.10.23

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

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

1401

2025.12.05

string转int
string转int

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

5359

2023.08.02

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

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

319

2026.04.23

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

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

4787

2023.07.18

堆和栈区别
堆和栈区别

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

2168

2023.08.10

空指针异常处理
空指针异常处理

本专题整合了空指针异常解决方法,阅读专题下面的文章了解更多详细内容。

179

2025.11.16

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

200

2026.09.23

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

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

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