首页硬件设计应用案例总结,如何查阅valgrind内存泄漏检测报告

总结,如何查阅valgrind内存泄漏检测报告

时间2025-07-11 11:53:42发布caterwang分类应用案例浏览34

检测命令

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	默认不显示“仍可访问”的内存详情。


凯特网版权声明:以上内容允许转载,但请注明出处,谢谢!

展开全文READ MORE
openEuler 24.03 docker 存储路径修改实操

游客 回复需填写必要信息