我有两个关于 umdh 的基本问题:
如果它所做的只是报告分配而不是解除分配,它如何帮助我找到泄漏?在差异结果中,我得到了很多新的分配,但是没有报告哪些被释放,哪些没有被释放(从而导致泄漏)。
差异报告按分配大小递减排序。在报告的底部有一些分配是负数,分配的数量是0。这是什么意思?
我有两个关于 umdh 的基本问题:
如果它所做的只是报告分配而不是解除分配,它如何帮助我找到泄漏?在差异结果中,我得到了很多新的分配,但是没有报告哪些被释放,哪些没有被释放(从而导致泄漏)。
差异报告按分配大小递减排序。在报告的底部有一些分配是负数,分配的数量是0。这是什么意思?
UMDH(或实际上:由于 GFlag 设置而导致的 Windows)将在为对象分配内存时存储调用堆栈。如果该内存被释放,调用堆栈也会丢失。但这没关系,因为它已被释放并且在这种情况下您没有泄漏。
所以剩下的项目(你看到的所有东西)都是(可能)导致泄漏的分配。对于所有这些分配,您知道对象是在哪里创建的(从调用堆栈中),并且您的任务是找出应该在哪里释放它(例如通过代码审查)。
我不太确定这一点,但请考虑在您拍摄第一个 UMDH 快照之前存在的长寿对象。如果稍后释放它,它将显示为负内存。在这种情况下,您可能也没有调用堆栈(如 1. 中所述),它只是一个信息。
这可能表明您应该更早地开始制作 UMDH 快照,但如果大小与您正在寻找的对象不匹配,通常也可以忽略这些快照。