总结,如何查阅valgrind内存泄漏检测报告
检测命令
valgrind --tool=memcheck --leak-check=full --log-file=valgring.log ./hriExecCtrl
报告结论
==417113== LEAK SUMMARY: ==417113== definitely lost: 14,528 bytes in 96 blocks ==417113== indirectly lost: 1,302,289 bytes in 273 blocks ==417113== possibly lost: 16,400 bytes in 41 blocks ==417113== still reachable: 6,568,169 bytes in 13,367 blocks ==417113== of which reachable via heuristic: ==417113== stdstring : 31,621 bytes in 839 blocks ==417113== newarray : 1,104 bytes in 4 blocks ==417113== suppressed: 0 bytes in 0 blocks ==417113== Reachable blocks (those to which a pointer was found) are not shown. ==417113== To see them, rerun with: --leak-check=full --show-leak-kinds=all ==417113== ==417113== Use --track-origins=yes to see where uninitialised values come from ==417113== For lists of detected and suppressed errors, rerun with: -s ==417113== ERROR SUMMARY: 4871 errors from 197 contexts (suppressed: 0 from 0)
报告解析
1. 泄漏分类总结 Valgrind 将内存泄漏分为 4 类(按严重性排序): (1) Definitely Lost(明确泄漏)14,528 bytes in 96 blocks 最严重的泄漏:程序直接丢失了动态分配的内存(如 malloc/new 但未释放)。 可能原因:忘记调用 free()/delete,或指针丢失后无法释放。 修复建议:检查 96 处分配点的代码,确保每次分配都有对应的释放。 (2) Indirectly Lost(间接泄漏)1,302,289 bytes in 273 blocks 关联结构体/类的内存泄漏:例如,某个结构体指针泄漏导致其内部成员指针也无法释放。 可能原因:复杂数据结构(如链表、树)的根节点泄漏,或析构函数未正确释放成员。 修复建议:检查数据结构的生命周期管理,确保根节点释放时能递归释放所有成员。 (3) Possibly Lost(可能泄漏)16,400 bytes in 41 blocks 潜在指针错误:分配的内存指针可能被错误计算(如 ptr+1 导致 free(ptr) 无法匹配)。 可能原因:指针运算错误或数组越界。 修复建议:检查这 41 处指针的使用逻辑,确保 free() 的参数与 malloc() 完全一致。 (4) Still Reachable(仍可访问)6,568,169 bytes in 13,367 blocks 非泄漏但未释放的内存:程序退出时这些内存仍被全局/静态指针引用(如全局变量、单例模式)。 常见情况: 程序未主动释放全局资源(如缓存、配置对象)。 C++ 的 std::string 或容器(如 std::vector)在全局对象中持有内存。 是否需要修复? 如果这些内存是故意保留的(如程序重启时复用),可以忽略。 如果是临时缓存,应在程序退出前手动释放。 细分提示: stdstring: 31,621 bytes in 839 blocks:大量字符串未释放。 newarray: 1,104 bytes in 4 blocks:动态数组未释放。 2. 其他关键信息 ERROR SUMMARY: 4871 errors from 197 contexts 程序存在 4871 处内存错误(如非法读写、使用未初始化值等),需结合完整日志分析。 使用 --track-origins=yes 定位未初始化值的来源。 Reachable blocks are not shown 默认不显示“仍可访问”的内存详情。
凯特网版权声明:以上内容允许转载,但请注明出处,谢谢!