news 2026/7/2 18:14:17

C++ 内存泄漏:ASAN 工具使用教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++ 内存泄漏:ASAN 工具使用教程

C++ 内存泄漏:ASAN 工具 超详细使用教程

AddressSanitizer(ASAN)是 C++ 排查内存泄漏的工具,比 Valgrind 快 5~10 倍,GCC/Clang/VS 全都自带,不用额外安装,直接编译就能用。

它能精准检测:

  • 内存泄漏(malloc/new 没 free/delete)
  • 堆溢出、栈溢出
  • 野指针、重复释放
  • 使用已释放内存

一、1 分钟快速上手(直接复制用)

1. 编译命令

GCC / Clang编译时加一个参数:

# 必加:-fsanitize=addressg++-g-fsanitize=address main.cpp-otest

运行程序:

./test

程序退出时,ASAN 会自动打印泄漏位置 + 代码行号。


二、完整示例:检测出泄漏

测试代码(故意写内存泄漏)

#include<iostream>usingnamespacestd;voidtest_leak(){// 堆上申请内存,没有 delete → 泄漏int*arr=newint[100];}intmain(){test_leak();return0;}

编译 + 运行

g++-g-fsanitize=address main.cpp-otest./test

ASAN 直接输出泄漏结果

ERROR: LeakSanitizer: detected memory leaks Direct leak of 400 byte(s) in 1 object(s) allocated from: #0 operator new[](unsigned long) (libasan.so+...) #1 test_leak() main.cpp:6 #2 main main.cpp:10

直接告诉你

  • 哪一行泄漏:main.cpp 第 6 行
  • 泄漏大小:400 字节
  • 哪个函数:test_leak()

三、ASAN 常用编译参数(必记)

1. 基础必用(检测泄漏+越界)

g++-g-fsanitize=address test.cpp-otest
  • -g:保留调试信息(必须加,否则不显示行号)
  • -fsanitize=address:开启 ASAN

2. 只检测内存泄漏(更快)

# 只检查泄漏,不检查越界/野指针g++-g-fsanitize=leak test.cpp-otest

3. 关闭泄漏检查(只查越界)

exportASAN_OPTIONS=detect_leaks=0./test

四、Windows VS 使用 ASAN

VS 2019 及以上原生支持,不用装插件:

  1. 右键项目 →属性
  2. C/C++ → 常规 → 启用地址消毒剂→ 选择是 (/fsanitize=address)
  3. 重新编译运行
  4. 输出窗口直接显示泄漏行号

五、ASAN 泄漏报告怎么看?

报告结构非常清晰:

ERROR: LeakSanitizer: detected memory leaks Direct leak of 400 byte(s) in 1 object(s) allocated from: #0 operator new[](unsigned long) #1 test_leak() main.cpp:6 <-- 泄漏代码行 #2 main main.cpp:10

重点看:

  1. Direct leak:直接泄漏
  2. byte(s):泄漏大小
  3. main.cpp:6精确到行号
  4. 调用栈:谁申请了没释放

六、C++ 最常见的泄漏场景(ASAN 一键查出)

1. new 没 delete / new[] 没 delete[]

int*p=newint;// 没 delete p; → 泄漏

2. 容器/指针忘记释放

vector<int*>vec;vec.push_back(newint);// 程序结束没遍历 delete → 泄漏

3. 类中指针没在析构函数释放

classA{int*p;public:A(){p=newint;}// ~A() { delete p; } 析构函数忘写 → 泄漏};

4. 函数内申请内存,没有返回也没有释放

voidfunc(){char*buf=newchar[1024];// 没释放,直接退出 → 泄漏}

七、注意事项

  1. ASAN 会增加内存占用(约 2x),性能下降约 2 倍
    → 只用于测试/调试不要上线生产环境
  2. 必须加-g编译,才能显示行号
  3. 多线程程序也能正常检测。
  4. 有些库(如第三方静态库)没开 ASAN,可能出现误报,可用:
    exportASAN_OPTIONS=detect_leaks=0

总结

  1. C++ 排查内存泄漏首选 ASAN,自带能准确定位到行号。
  2. 编译只需要加:-g -fsanitize=address
  3. 运行程序,退出后自动打印泄漏报告
  4. 能查:泄漏、越界、野指针、重复释放。

你只要把你的代码用这个参数重新编译运行,就能立刻看到所有内存泄漏位置。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/3 0:20:13

batis框架搭建

官方链接&#xff1a;MyBatis 3 | 入门 – mybatis 1.创建数据库表 2.idea项目创建 3.添加依赖&#xff0c;mysql,mybatis等 maven官方网站:Maven Repository: com.mysql mysql-connector-j 8.3.0 标红可能需要在idea右侧点击刷新 4.mybatis.xml配置 5.idea创建实体类接收…

作者头像 李华
网站建设 2026/7/1 3:39:31

Claude-Code源码解读--Tools篇 --持续更新中...

默认可见工具&#xff1a;普通会话通常包含 Read、Edit、Write、Bash、Glob、Grep、WebSearch、WebFetch、TodoWrite、Agent、Skill、EnterPlanMode、ExitPlanMode、AskUserQuestion 等。条件启用&#xff1a;表中「需功能开关/环境变量」的工具&#xff0c;在未满足条件时不会…

作者头像 李华
网站建设 2026/7/1 3:38:58

Agentic AI:从被动应答到主动规划的智能体技术落地指南

如果你最近关注AI领域&#xff0c;可能会发现一个现象&#xff1a;很多技术讨论和产品发布&#xff0c;开始从“大模型能做什么”转向“大模型能自主完成什么”。这种转变背后&#xff0c;是一个被称为Agentic AI或智能体AI的概念正在从实验室走向产业应用的核心地带。过去一年…

作者头像 李华
网站建设 2026/7/1 3:38:47

2026国内GPU算力租赁平台权威排行榜|资质、算力、性价比、生态、售后五大维度百分制评分拆解

一、引言&#xff1a;GPU平台排行榜标准化评分体系当前网络各类GPU算力排行榜仅简单对比时租单价&#xff0c;缺少统一、可复现的量化评分标准&#xff0c;榜单结果失真严重。本文联合第三方算力测评机构制定五大维度百分制权威评分体系&#xff0c;总分100分&#xff0c;各维度…

作者头像 李华
网站建设 2026/7/1 3:38:15

抖店妙手一键下单工具与其它下单工具有什么区别

抖店妙手一键下单工具与其它下单工具有什么区别?现如今&#xff0c;做抖店一件代发的商家越来越离不开抖店一键下单工具了&#xff0c;抖店一键下单工具从“效率辅助”变成了商家运营的必须品&#xff0c;随着抖店一键下单工具普及率越来越高&#xff0c;市面上的一键下单工具…

作者头像 李华
网站建设 2026/7/1 3:38:07

如何接入华为实时语音识别-语音转文字免费版

华为官方开发者文档过于庞大&#xff0c;所以非常多基础说明的文档是复用的 如果你是第一次接触接入华为的能力很容易被相互引用的链接跳转绕晕 所以我整理了一下从基础配置准备到&#xff0c;真正接入实时语音识别完整的过程 每一节也附上了官方链接&#xff0c;如果下面没有…

作者头像 李华