当调试情况下运行程序时,在输出窗口的Debug 标签处_CrtDumpMemoryLeaks表现出内存泄漏的信息。内存泄漏信息类似下面这样: Detected memory leaks! Dumping objects -> C:PROGRAM FILESVISUAL STUDIOMyProjectsleaktestleaktest.cpp(20) : normal block at 0x00780E80, 64 bytes long. Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD Object dump complete.
假如你没有用#define _CRTDBG_MAP_ALLOC说明,内存漏洞堆存处类似下面这样: Detected memory leaks! Dumping objects -> normal block at 0x00780E80, 64 bytes long. Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD Object dump complete.
在内存分配数目处设置一个断点 在内存泄漏报告中的文件名和行号可告诉你泄漏的内存在那里被分配,但是了解内存在那里分配对于鉴定问题不总是充分的。在一个程序运行过程中,经常是一个分配将会被调用很多次,但是它可能在某次调用中泄漏内存。为了确定问题,你必须不但知道泄漏的内存在那里分配,还要知道泄漏发生的条件。对你来说,使它成为可能的那条信息是内存分配号。当那些被显示的时候,文件名和行号之后,这是在curly brace中出现的数值。例如,在下面的输出中,"18"是内存分配号。它的意思是泄漏的内存是你程序中内存分配的第十八个模块。 Detected memory leaks! Dumping objects -> C:PROGRAM FILESVISUAL STUDIOMyProjectsleaktestleaktest.cpp(20) : normal block at 0x00780E80, 64 bytes long. Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD Object dump complete.
此函数打印出类似于下面这样的一堆内存分配信息: 0 bytes in 0 Free Blocks. 0 bytes in 0 Normal Blocks. 3071 bytes in 16 CRT Blocks.
0 bytes in 0 Ignore Blocks. 0 bytes in 0 Client Blocks. Largest number used: 3071 bytes. Total allocations: 3764 bytes.
为了确定一个内存泄漏是否在一节代码中出现,你可以在此节前和此节后对内存状态作快照,然后用_CrtMemDifference比较两种状态: _CrtMemCheckpoint( &s1 ); // memory allocations take place here _CrtMemCheckpoint( &s2 );
if ( _CrtMemDifference( &s3, &s1, &s2) ) _CrtMemDumpStatistics( &s3 );