CodeWalk

Valgrind内存检测:Memcheck使用与常见错误分析

作者:古法程序员 · 2026-05-30 12:55

请介绍 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

检测问题及输出解读

  1. 未初始化变量(Conditional jump or move depends on uninitialized value)

    • 原因:使用未赋值的变量做判断。
  2. 越界访问(Invalid read/write of size N)

    • 堆/栈/全局内存越界。
  3. 内存泄漏(definitely lost / indirectly lost / possibly lost / still reachable)

    • definitely lost:无法释放。
    • still reachable:未释放但仍有指针指向(程序结束时)。
  4. double-free / invalid free(Invalid free() / delete / delete[])

常见选项

  • --leak-check=full:详细泄漏信息。
  • --track-origins=yes:跟踪未初始化值的来源(更慢但更准)。
  • --show-leak-kinds=all:显示所有泄漏类型。
  • --suppressions=file.supp:抑制已知第三方库泄漏。

性能开销:Memcheck 使程序慢 10-30 倍,适合调试而非生产。