【发布时间】:2014-11-11 14:36:21
【问题描述】:
背景
我已经设置了一个测试工具来测试我正在为一个项目开发的 DLL 中的一组函数。
我想验证函数在 Windows 系统上的内存泄漏为零。
我已经正确设置了 UMDH,并且能够获得两个堆转储之间的比较文件。甚至堆栈跟踪也显示得很好。
问题
diff 的输出让我感到困惑,我希望有人能帮助解释为什么我得到了我得到的输出。
比较日志的输出:
+ 56 ( 56 - 0) 1 allocs BackTrace9C160
+ 1 ( 1 - 0) BackTrace9C160 allocations
我将 log1 和 log2 设置为分开 1 个整数分配,只是为了验证我的设置。
确实,它只显示了 1 个分配,但是,它是说前后有 56 字节的变化。我只希望 sizeof(int) 以字节为单位变化。在我的系统上,int 分配的大小是 4 字节,所以我希望看到 +4,而不是 +56。
同样,在日志之间运行的唯一代码行是
new int; //purposely leak memory
有什么解释吗?
附加信息:
IDE/编译器:Visual Studio 2010
应用程序是 64 位
涉及一个 DLL(但在这个简单的 int 分配示例中我什至没有调用它)
如果我注释掉泄漏,我得到零分配和 +0 字节。所以我认为这可以验证应用程序中的其他任何地方都没有额外的字节,只需从上面显示的那一行...
解决方案
请参阅下面的 SleuthEye 解决方案。另外,我添加了一条评论作为对解决方案的评论,我认为这对最终使用此问题的人有益:
此外,如果您在 .exe 的发布版本上运行此程序,并且还在运行目录中包含程序调试数据库,则 umdh 将提取源文件名和内存泄漏的行号,同时保持准确的字节数数。就内存泄漏搜索而言,这为您提供了调试和发布版本的好处。
【问题讨论】:
-
我认为这是由于使用 debug heap 时分配的额外字节所致。
标签: c++ c windows debugging 64-bit