由于单个泄漏的数量可能会非常大,因此运行时检查会自动将同一位置分配的泄漏合并到一个合并泄漏报告中。是合并泄漏还是分别报告泄漏由 number-of-frames-to-match 参数控制,该参数通过 check -leaks 中的 -match m 选项或 showleaks 命令的 -m 选项指定。如果两个或更多泄漏分配时的调用栈与 m 帧在严格程序计数器等级匹配,便会在一个合并泄漏报告中报告这些泄漏。
假设有下列三个调用序列:
块 1 |
块 2 |
块 3 |
---|---|---|
[1] malloc |
[1] malloc |
[1] malloc |
[2] d() at 0x20000 |
[2] d() at 0x20000 |
[2] d() at 0x20000 |
[3] c() at 0x30000 |
[3] c() at 0x30000 |
[3] c() at 0x31000 |
[4] b() at 0x40000 |
[4] b() at 0x41000 |
[4] b() at 0x40000 |
[5] a() at 0x50000 |
[5] a() at 0x50000 |
[5] a() at 0x50000 |
如果所有这些块均导致内存泄漏,则 m 值决定泄漏按单独泄漏还是一个重复泄漏来报告。如果 m 为 2,则块 1 和块 2 按一个重复泄漏来报告,因为两个调用序列 malloc() 上的 2 个栈帧相同。块 3 将按单独泄漏来报告,因为 c() 的跟踪与其他块不匹配。如果 m 大于 2,运行时检查会将所有泄漏按单独泄漏来报告。(malloc 不显示在泄漏报告中。)
一般情况下,m 值越小,生成的单个泄漏报告越少,合并泄漏报告越多。m 值越大,生成的合并泄漏报告越少,单个泄漏报告越多。