必须用--leak-resolution=high时:程序大量使用malloc+realloc、频繁堆上小块拼接(如字符串构建、协议解析)或依赖Qt/GLib等频繁分配/合并内存的第三方库,否则low会合并多个独立泄漏而漏掉真实泄漏点。

--leak-resolution=high 通常更值得选,但不是无条件“越高越好”。
什么时候必须用 --leak-resolution=high
当你的程序大量使用 malloc + realloc、或频繁在堆上做小块内存拼接(比如字符串构建、协议解析)、或依赖第三方库(如 Qt、GLib)内部频繁分配/合并内存时,--leak-resolution=low 会把多个独立泄漏“合并成一个”,漏掉真实泄漏点。
-
--leak-resolution=low:只比对分配栈帧的最顶层函数名(比如全归到malloc或operator new),无法区分不同调用位置 -
--leak-resolution=high:比对整个调用栈(至少前 4 层),能区分parse_json()里漏的 vsload_config()里漏的
--leak-resolution=med 是多数项目的平衡点
它在精度和开销之间折中:记录调用栈前 2–3 层,基本能定位到源文件+函数,且性能损耗比 high 小约 15–20%。如果你的泄漏报告里反复出现“same leak at multiple locations”,说明 med 已不够,该升 high。
- 默认值是
med,不是low—— 别被旧文档误导 -
high会使 Valgrind 内存占用增加 30% 以上,对大进程可能 OOM - 若你用
--track-origins=yes,再配high会进一步拖慢,慎叠
别踩这个坑:--leak-resolution 和 --leak-check 不是一回事
新手常混淆:--leak-check=full 控制是否报告泄漏详情(行号、大小、栈),而 --leak-resolution 控制“多少个泄漏算作同一个”。两者独立生效:
- 即使
--leak-check=full,若--leak-resolution=low,仍可能把 5 处泄漏报告成 “1 个泄漏,共 2KB”,且栈只显示malloc - 真正要定位到
foo.c:42,得同时满足:--leak-check=full+--leak-resolution=high+ 编译带-g
实际调试时,先跑一遍 --leak-resolution=med 看报告结构;如果泄漏聚合严重、或关键路径没展开,再加 high。不要一上来就设 high —— 它会让 Valgrind 对 1GB 进程的运行时间翻倍,而且你未必需要那么细的栈深度。


















