讲师中心 微信公众号

工具推荐

视频效率加速
剧云
剧云

中文短剧剧本制作平台

Laper
Laper

剧本策划到成片协作

AniShort
AniShort

AI短剧协同制作平台

立刻MV
立刻MV

低成本歌曲 MV、视频生成

C++如何检测内存泄漏?(Valgrind与AddressSanitizer)

冬伟吖_1124

冬伟吖_1124

发布时间:2026-02-26 08:51:34

|

517人浏览过

|

来源于php中文网

原创

Valgrind仅支持Linux(部分BSD),需动态链接、禁用优化(-O0)、保留调试符号(-g);ASan需编译链接均加-fsanitize=address并设ASAN_OPTIONS;二者不可共存,应分阶段使用。

c++如何检测内存泄漏?(valgrind与addresssanitizer)

Valgrind 在 Linux 上跑不起来?先确认这三件事

Valgrind 本身不支持 macOS 和 Windows,只在 Linux(或部分 BSD)上可用,而且要求程序是动态链接的。静态链接的二进制、用了 __attribute__((constructor)) 过多的初始化逻辑、或者启用了某些内核级防护(如 ptrace 被禁用),都会导致 valgrind 启动失败或报 Illegal instruction。

  • 检查是否在 Ubuntu/Debian 系统上安装了完整版:sudo apt install valgrind(别只装 valgrind-dbg)
  • 编译时务必关闭优化(-O0),并保留调试符号(-g),否则行号和函数名全丢失
  • 避免用 std::thread + fork() 混用——Valgrind 对 fork 后的子进程跟踪不稳定,容易漏报

AddressSanitizer 报 heap-use-after-free 却找不到源头?

ASan 默认只显示崩溃点,不追溯分配位置。想定位原始 malloc 或 new 行,必须加运行时标志,而且得在编译时就埋好钩子。

  • 编译加 -fsanitize=address -g,链接也得带 -fsanitize=address(CMake 中要设 CMAKE_CXX_FLAGS 和 CMAKE_EXE_LINKER_FLAGS)
  • 运行前设环境变量:ASAN_OPTIONS=detect_stack_use_after_return=true:abort_on_error=true
  • 如果用的是 C++17 的 std::pmr::memory_resource 或自定义分配器,ASan 默认不拦截——得手动调用 __asan_poison_memory_region 和 __asan_unpoison_memory_region

为什么 Valgrind 说没泄漏,但 RSS 内存持续上涨?

Valgrind 只检测堆内存(malloc/new 分配的),对 mmap/mprotect 分配的大块内存、线程栈、共享库数据段、甚至 std::string 的 SSO 缓冲区都不管。RSS 上涨 ≠ 堆泄漏。

C++14
C++14

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

下载
  • 用 pmap -x <pid></pid> 查看各内存段大小,重点关注 [anon] 和 stack
  • 怀疑线程泄漏?查 /proc/<pid>/status</pid> 里的 Threads: 字段,再结合 ps -T -p <pid></pid>
  • std::unordered_map 插入大量元素后不 shrink,会持有远超实际需要的 bucket 数组——这不是泄漏,但 Valgrind 不提醒你

ASan 和 Valgrind 能不能一起用?

不能。二者都靠插桩或二进制重写拦截内存操作,同时启用会冲突,轻则报错退出,重则触发未定义行为。选一个就行:开发阶段用 ASan(快、报错准),发布前回归用 Valgrind(覆盖更全,能发现 ASan 漏掉的未初始化读)。

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

  • ASan 编译产物体积大、运行慢 2–3 倍,但能在几秒内复现问题
  • Valgrind 运行慢 10–50 倍,且对多线程程序的误报率略高(比如条件变量唤醒顺序被重排)
  • CI 流水线里建议优先跑 ASan,Valgrind 留给 nightly 手动触发

真正难搞的是跨模块内存管理——比如 A 库用 new 分配、B 库用 free 释放,ASan 和 Valgrind 都可能沉默。这种得靠统一 allocator + 静态分析工具辅助。

热门AI工具

更多
Atoms
Atoms Hot

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

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

WorkBuddy

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

DeepSeek

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

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

超级简历WonderCV

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

豆包大模型

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

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

相关专题

更多
string转int
string转int

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

7539

2023.08.02

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

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

7027

2023.07.18

堆和栈区别
堆和栈区别

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

2888

2023.08.10

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

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

7027

2023.07.18

堆和栈区别
堆和栈区别

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

2888

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

4878

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

1369

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

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

463

2026.01.21

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

40

2026.11.12

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
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