如何:拍内存快照
更新:2007 年 11 月
本主题适用于:
版本 |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
速成版 |
仅限本机 |
|||
标准版 |
仅限本机 |
|||
专业团队版 |
仅限本机 |
表格图例:
适用 |
|
不适用 |
|
默认情况下隐藏的一条或多条命令。 |
说明: |
---|
显示的对话框和菜单命令可能会与“帮助”中的描述不同,具体取决于您的当前设置或版本。若要更改设置,请在“工具”菜单上选择“导入和导出设置”。有关更多信息,请参见 Visual Studio 设置。 |
本主题显示如何拍内存快照以帮助定位内存泄漏。
检测内存泄漏
创建一个 CMemoryState Members 对象并调用 CMemoryState::Checkpoint 成员函数。这将创建第一个内存快照。
在程序执行了其内存分配和释放操作以后,创建另一个 CMemoryState 对象,并为该对象调用 Checkpoint。这将得到内存使用的第二个快照。
创建第三个 CMemoryState 对象,并调用其 CMemoryState::Difference 成员函数,同时将前两个 CMemoryState 对象作为参数提供。如果这两个内存状态之间有差异,则 Difference 函数将返回非零值。这指示有些内存块尚未被释放。
本示例显示相应的代码:
// Declare the variables needed #ifdef _DEBUG CMemoryState oldMemState, newMemState, diffMemState; oldMemState.Checkpoint(); #endif // Do your memory allocations and deallocations. CString s("This is a frame variable"); // The next object is a heap object. CPerson* p = new CPerson( "Smith", "Alan", "581-0215" ); #ifdef _DEBUG newMemState.Checkpoint(); if( diffMemState.Difference( oldMemState, newMemState ) ) { TRACE( "Memory leaked!\n" ); } #endif
请注意,内存检查语句由 #ifdef _DEBUG / #endif 块括起来,这样就只能在程序的 Win32 调试版本中对它们进行编译。
既然已经知道存在内存泄漏,便可以使用另一个成员函数 CMemoryState::DumpStatistics 来查看内存统计信息,该统计数据将有助于对其进行定位。