Valgrind是Linux下检测C/C++内存问题的核心工具,需-g -O0编译,用--leak-check=full --show-leak-kinds=all检测泄漏,重点关注definitely lost等四类问题,并通过suppressions过滤系统库误报。
Valgrind 是 Linux 下最常用的内存调试工具之一,尤其擅长检测 C/C++ 程序中的内存泄漏、非法内存访问、使用未初始化内存等问题。它不依赖编译器特殊支持,但要求程序用 debug 信息 编译(即带 -g),且最好关闭优化(-O0),否则行号和调用栈可能不准。
确保用 g++ -g -O0 编译你的 C++ 程序,避免内联和优化干扰定位:
g++ -g -O0 -o myapp main.cpp utils.cppCMakeLists.txt 中设置:set(CMAKE_BUILD_TYPE Debug) 并确保 CMAKE_CXX_FLAGS_DEBUG 包含 -g
-s(strip)或启用 -DNDEBUG,否则丢失符号和断言信息用 valgrind --leak-check=full --show-leak-kinds=all 启动程序:
valgrind --leak-check=full --show-leak-kinds=all ./myapp arg1 arg2-
-leak-check=full 显示完整泄漏详情(包括分配位置)--show-leak-kinds=all 报告 definitely lost、indirectly lost、possibly lost 和 still reachable 四类--track-origins=yes(追踪未初始化值来源)、--log-file=valgrind-out.txt(输出到文件)Valgrind 报告中重点关注以下几类(按严重性排序):
definitely lost 对象所引用的内存 —— 通常随主问题解决而消失某些系统库(如 glibc、Qt)或 STL 实现会在进程退出前延迟释放内部缓存,造成“假阳性”泄漏。可通过以下方式过滤:
--suppressions=/usr/lib/valgrind/debian.supp(Debian/Ubuntu)或对应发行版 suppressions 文件--gen-suppressions=yes 生成后保存)virtual ~Base() = default;)std::shared_ptr 循环引用,Valgrind 会将其报告为 definitely lost(实际是逻辑泄漏)