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