本主题适用于:
版本 |
Visual Basic |
C# |
F# |
C++ |
Web Developer |
---|---|---|---|---|---|
学习版 |
![]() |
![]() |
![]() |
仅限本机 |
![]() |
专业版、高级专业版和旗舰版 |
![]() |
![]() |
![]() |
仅限本机 |
![]() |
提示
显示的对话框和菜单命令可能会与“帮助”中的描述不同,具体取决于您现用的设置或版本。 若要更改设置,请在“工具”菜单上选择“导入和导出设置”。 有关更多信息,请参见 使用设置。
本主题显示如何拍内存快照以帮助定位内存泄漏。
检测内存泄漏
创建一个 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 来查看内存统计信息,该统计数据将有助于对其进行定位。