0

0

c++ memory leak检测_c++内存泄漏排查方法

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-01-04 14:41:10

|

690人浏览过

|

来源于php中文网

原创

_crtdumpmemoryleaks() 是 windows 下最轻量的泄漏检测方式,仅需在 main 开头调用 _crtsetdbgflag 并启用调试堆,程序退出时自动报告未释放内存,但无调用栈且依赖正常返回。

c++ memory leak检测_c++内存泄漏排查方法

_CrtDumpMemoryLeaks() 在 Windows 下快速捕获泄漏

Windows 平台下最轻量、无需额外工具的泄漏检测方式,依赖 MSVC 的 CRT 调试堆。它只在程序退出时打印未释放的堆块摘要,不提供调用,但胜在开箱即用。

关键点:

  • 必须在程序入口(如 main())开头调用 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
  • 确保使用调试版(/MDd/MTd),且定义了 _DEBUG
  • 泄漏报告中显示的文件名和行号,依赖于在 #include <crtdbg.h></crtdbg.h> 前定义 _CRTDBG_MAP_ALLOC
  • 若程序有多个出口(如提前 exit() 或异常终止),泄漏可能不被触发——需确保正常返回到 main 末尾
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#include <iostream>
<p>int main() {
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
int* p = new int[100];
// 忘记 delete[] p;
return 0; // 此处触发检查
}

Linux/macOS 下用 valgrind --leak-check=full 定位源头

valgrind 是跨平台事实标准,但仅适用于 Linux/macOS(macOS Catalina+ 需注意系统限制)。它能精确指出每一块泄漏内存的分配位置,包括函数名、源码行、调用栈。

常见误操作:

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

Short AI
Short AI

AI短视频生成器,轻松创作爆款短视频!

下载
  • 未用 -g 编译,导致报告里只有地址没有符号——务必加 g++ -g -O0
  • 忽略 --track-origins=yes:对“未初始化值”间接导致的泄漏排查很有用
  • 误以为 --leak-check=summary 够用:它只报总数,漏掉具体泄漏点
  • C++ 异常路径未覆盖:若构造函数抛异常,new 分配后未匹配 delete,valgrind 会如实报告
g++ -g -O0 leak.cpp -o leak
valgrind --leak-check=full --show-leak-kinds=all ./leak

AddressSanitizer(ASan)在编译期注入运行时检查

Clang/GCC 支持的 ASan 不仅查内存泄漏,还查越界、UAF、栈使用后释放等。相比 valgrind,它更快(约 2× 慢),且支持多线程,适合 CI 或日常开发启用。

启用方式简单,但有几个硬性前提:

  • 必须链接 ASan 运行时:GCC/Clang 默认已包含,但若静态链接或交叉编译需显式加 -fsanitize=address
  • 不能与 valgrind 共存(二者都劫持 malloc/free)
  • 默认不开启泄漏检测:需额外加 -fsanitize=address -fno-omit-frame-pointer -g 并设置环境变量 ASAN_OPTIONS=detect_leaks=1
  • 某些 STL 容器(如 std::string 的 SSO 优化)可能触发误报,可加 detect_stack_use_after_return=1 细化控制
g++ -fsanitize=address -fno-omit-frame-pointer -g leak.cpp -o leak
ASAN_OPTIONS=detect_leaks=1 ./leak

为什么 RAII 和智能指针不能完全避免泄漏?

RAII 是 C++ 抗泄漏的核心机制,但真实项目中仍有三类典型漏点:

  • std::shared_ptr 循环引用:两个对象互相持有对方的 shared_ptr,引用计数永不归零——改用 std::weak_ptr 打破循环
  • 裸指针被临时“托管”但未移交所有权:例如函数返回 new 出的指针,调用方忘记包装成 unique_ptr
  • 全局/静态对象析构顺序不确定:A 的析构函数中访问 B 的静态成员,而 B 已析构,可能导致释放逻辑跳过或崩溃,间接掩盖泄漏
  • 第三方库内部泄漏:比如用了 dlopen 加载的插件未调用对应 dlclose,ASan 和 valgrind 能发现,但无法直接修复

真正难排查的,往往不是 new 没配 delete,而是资源生命周期跨越模块边界、析构时机不可控、或工具链本身对某些分配模式(如 mmap、自定义 allocator)无感知。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
string转int
string转int

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

930

2023.08.02

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

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

434

2023.07.18

堆和栈区别
堆和栈区别

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

600

2023.08.10

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

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

434

2023.07.18

堆和栈区别
堆和栈区别

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

600

2023.08.10

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

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

743

2023.08.10

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

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

375

2025.12.24

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

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

27

2026.01.21

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

4

2026.03.05

热门下载

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

精品课程

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

共48课时 | 10.2万人学习

Git 教程
Git 教程

共21课时 | 4万人学习

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

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