背景
我已经建立了一个测试工具来测试我正在为一个项目开发的DLL中的一组函数。
我想验证这些函数在windows系统上是否有零内存泄漏。
我已经正确地设置了UMDH,并且能够在两个堆转储之间获得一个比较文件。连堆栈痕迹都显示得很好。
问题
来自diff的输出令我困惑,我希望有人能帮助我解释为什么我得到了我得到的输出。
比较日志的输出:
+ 56 ( 56 - 0) 1 allocs BackTrace9C160
+ 1 ( 1 - 0) BackTrace9C160 allocations我将log1和log2设置为1整数分配,只是为了验证我的设置。
实际上,它只显示了一个分配,然而,它是说,有一个56字节的变化,从前和后。我只期望以字节为单位进行较大的(Int)变化。在我的系统上,int分配的大小是4个字节,所以我希望看到的是+4,而不是+56。
同样,在日志之间运行的唯一代码行是
new int; //purposely leak memory有什么解释吗?
附加信息:
IDE/编译器: Visual 2010
应用程序为64位
涉及一个DLL (但在这个简单的int分配示例中,我甚至没有调用它)
如果我注释掉泄漏,就会得到零分配和+0字节。因此,我认为这可以验证没有额外的字节来自应用程序中的任何其他地方,仅仅是从上面所示的1行.
解决方案
请参阅下面的侦察眼的解决方案。此外,我还补充了一条评论,作为对解决方案的评论,我认为这对最终使用这个问题的人是有益的:
此外,如果您在.exe的发布版本上运行此程序,并且在运行目录中还包括程序调试数据库,那么umdh将提取源文件名和内存泄漏的行号,同时保持准确的字节计数。这为您提供了调试和发布版本的好处,只要进行内存泄漏搜索。
发布于 2014-11-12 03:48:12
这56个字节是C运行时库(CRT)在使用调试堆时分配的额外内存造成的,如MSDN所述。
查看dbbint.h,其中_CrtMemBlockHeader结构定义为:
#define nNoMansLandSize 4
typedef struct _CrtMemBlockHeader
{
struct _CrtMemBlockHeader * pBlockHeaderNext;
struct _CrtMemBlockHeader * pBlockHeaderPrev;
char * szFileName;
int nLine;
#ifdef _WIN64
/* These items are reversed on Win64 to eliminate gaps in the struct
* and ensure that sizeof(struct)%16 == 0, so 16-byte alignment is
* maintained in the debug heap.
*/
int nBlockUse;
size_t nDataSize;
#else /* _WIN64 */
size_t nDataSize;
int nBlockUse;
#endif /* _WIN64 */
long lRequest;
unsigned char gap[nNoMansLandSize];
/* followed by:
* unsigned char data[nDataSize];
* unsigned char anotherGap[nNoMansLandSize];
*/
} _CrtMemBlockHeader;然后是分配给int的内存,然后是另外4个字节的"NoMansLand“缓冲区。因此,对于64位应用程序,为单个int的测试用例分配的内存总数为sizeof(_CrtMemBlockHeader)+sizeof(int)+4 = 48+4+4 = 56。
注意,相同的分析运行在发行版构建(其中没有分配_CrtMemBlockHeader )产生以下比较日志输出:
+ 4 ( 4 - 0) 1 allocs BackTrace2
+ 1 ( 1 - 0) BackTrace2 allocations发布于 2015-06-19 12:59:13
https://stackoverflow.com/questions/26867331
复制相似问题