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

C++ 什么是内存泄漏 C++ Valgrind检测内存泄漏教程【工具】

陌浩小哥_6773

陌浩小哥_6773

发布时间:2026-02-01 16:44:02

|

933人浏览过

|

来源于php中文网

原创

内存泄漏指C++中new/malloc后未delete/free,致堆内存持续增长、长期运行引发OOM;Valgrind需-g编译后运行检测,重点关注“definitely lost”类泄漏。

c++ 什么是内存泄漏 c++ valgrind检测内存泄漏教程【工具】

内存泄漏在 C++ 中到底意味着什么

内存泄漏不是程序崩溃,而是程序反复 new 或 malloc 但没配对调用 delete 或 free,导致堆内存持续增长、无法回收。它不会立刻报错,但长期运行会耗尽系统内存,引发卡顿、OOM 或被系统 kill。

典型场景包括:类中手动管理指针成员、异常路径遗漏 delete、容器存储裸指针后未清理、回调注册后忘记注销等。

注意:std::unique_ptr 和 std::shared_ptr 能大幅降低风险,但不等于免疫——比如循环引用、shared_ptr 持有裸指针再 new 出新对象却未交由智能指针接管,照样泄漏。

Valgrind 怎么跑出有效内存泄漏报告

Valgrind 不是编译器插件,而是一个运行时检测工具,必须用它启动你的可执行文件,且程序需用 -g 编译(保留调试符号),否则报告里只有地址,看不到源码行号。

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

基础命令:

valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./your_program

关键参数说明:

  • --leak-check=full:启用完整泄漏分析(默认是 summary)
  • --show-leak-kinds=all:显示 definitely lost / indirectly lost / possibly lost / still reachable 四类
  • --track-origins=yes:定位未初始化内存的来源(对“use of uninitialised value”类问题极有用)

常见误操作:直接对二进制加 valgrind 却忘了重新编译带 -g;或在 CI 环境中未安装 valgrind 导致命令静默失败;还有人把 valgrind 当成静态分析工具,试图扫描源码——它只作用于运行过程。

直播间话术巡检-windows
直播间话术巡检-windows

直播话术巡检系统(Windows版) — 实时语音转写、关键词检测、场景自动切换、告警推送、大屏可视化。支持 Windows VB-Cable 虚拟声卡音频采集,阿里云 ASR 实时识别。一键启动脚本,自动安装环境。

下载

看懂 Valgrind 报告里的 “definitely lost” 是关键

Valgrind 将泄漏分四类,真正要优先处理的是 definitely lost:指指针已丢失(栈/堆上都找不到指向该内存的有效地址),这块内存彻底不可达,100% 泄漏。

示例片段:

==12345== 40 bytes in 1 blocks are definitely lost in loss record 1 of 2
==12345==    at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==12345==    by 0x4005D9: main (test.cpp:8)

这表示 test.cpp 第 8 行调用了 malloc,但后续没 free,且无任何变量持有该地址。

其他三类含义:

  • indirectly lost:因父块泄漏导致的子指针泄漏(如结构体中指针成员指向的内存)
  • possibly lost:指针可能还在栈上,但 Valgrind 不确定是否还能访问(比如存在指针运算或 cast)
  • still reachable:程序退出前仍有指针指向它(如全局缓存、单例内部指针),不一定算 bug,但得人工确认是否合理

C++ 项目中 Valgrind 的实际使用限制

Valgrind 在 Linux 上工作良好,但 macOS 和 Windows 原生不支持;macOS 用户只能靠 AddressSanitizer(Clang/GCC 都支持)替代。

它不能检测所有内存问题:

  • 不捕获栈溢出或越界读(要用 AddressSanitizer)
  • 对多线程竞争检测弱(Helgrind 模块可用但开销大、误报多)
  • 无法识别逻辑泄漏(比如缓存不断 insert 却从不 erase,内存一直涨但每个指针都“活着”)
  • 若程序用 mmap 或自定义分配器绕过 malloc,默认模式下 Valgrind 会漏检

真实项目建议:CI 中固定跑 Valgrind + ASan 组合;本地开发时,对核心模块写带 teardown 的单元测试,再用 Valgrind 包裹单测执行;别等上线后 OOM 才想起查泄漏——那时堆栈早已被冲掉。

热门AI工具

更多
WorkBuddy

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

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

DeepSeek

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

UP简历
UP简历 Hot

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

豆包大模型

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

音述AI
音述AI Hot

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

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

相关专题

更多
golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

4954

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

5111

2025.07.04

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

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

379

2026.04.23

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

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

6207

2023.07.18

堆和栈区别
堆和栈区别

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

2608

2023.08.10

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

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

6207

2023.07.18

堆和栈区别
堆和栈区别

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

2608

2023.08.10

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

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

4418

2023.08.10

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

20

2026.10.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

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

共0课时 | 0人学习

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

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