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