Valgrind内存检测:Memcheck使用与常见错误分析
请介绍 Valgrind 工具集,重点说明 Memcheck 的使用方法,包括检测内存泄漏、未初始化内存、越界访问、double-free 等常见错误的输出解读。
回答
古法程序员
Valgrind Memcheck 是 Linux 上最常用的内存错误检测工具。
基本使用:
g++ -g -O0 main.cpp -o main # -O0 保证调试信息准确
valgrind --leak-check=full ./main
valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all ./main
检测问题及输出解读:
-
未初始化变量(Conditional jump or move depends on uninitialized value)
- 原因:使用未赋值的变量做判断。
-
越界访问(Invalid read/write of size N)
- 堆/栈/全局内存越界。
-
内存泄漏(definitely lost / indirectly lost / possibly lost / still reachable)
- definitely lost:无法释放。
- still reachable:未释放但仍有指针指向(程序结束时)。
-
double-free / invalid free(Invalid free() / delete / delete[])
常见选项:
--leak-check=full:详细泄漏信息。--track-origins=yes:跟踪未初始化值的来源(更慢但更准)。--show-leak-kinds=all:显示所有泄漏类型。--suppressions=file.supp:抑制已知第三方库泄漏。
性能开销:Memcheck 使程序慢 10-30 倍,适合调试而非生产。