cpp内存泄漏和代码检查工具
cppcheck
cppcheck属于静态代码检查工具,能处理比较多的类型。
如何使用
# 分析目录 cppcheck <path to dir> # 分析单个文件 cppcheck <path to cpp file>
valgrind
valgrind 是一个动态分析工具,包含memcheck
,cachegrind
,massif
等模块,可以用来检查内存使用,堆栈分析,CPU缓存操作等。
如何使用
# 使用memcheck工具,需保证<program>带有符号信息,即`-g`编译 valgrind <program>
对下面这段程序进行测试
int main() { int *i = new int(9); std::cout << *i << std::endl; // delete i; }
测试结果如图所示,这种级别的内存泄漏都能检查出来:
Sanitizer
Sanitizers是Google发起的开源工具集,包括AddressSanitizer
, MemorySanitizer
, ThreadSanitizer
, LeakSanitizer
。
Sanitizers
项目本是LLVM项目的一部分,但GNU也将该系列工具加入到了自家的GCC编译器中。
如何使用
Sanitizer | 用法示例 | 说明 |
---|---|---|
AddressSanitizer | gcc -fsanitize=address -g -o program program.c |
检测内存错误,如使用未初始化的内存、内存泄漏、缓冲区溢出等。 |
ThreadSanitizer | gcc -fsanitize=thread -g -o program program.c |
检测多线程程序中的数据竞争问题。 |
MemorySanitizer | gcc -fsanitize=memory -g -o program program.c |
检测未初始化的内存访问。 |
UndefinedBehaviorSanitizer (UBSan) | gcc -fsanitize=undefined -g -o program program.c |
检测C/C++程序中的未定义行为。例如,整数溢出、空指针引用等。 |
LeakSanitizer (实验性) | gcc -fsanitize=leak -g -o program program.c |
检测内存泄漏。 |
搭配CMake时,使用方式如下:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
同样对上面的cpp代码片段进行测试,效果如下:
本文来自博客园,作者:EricLing0529,转载请注明原文链接:https://www.cnblogs.com/ericling0529/p/18113147
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?