如何:拍内存快照

更新:2007 年 11 月

本主题适用于:

版本

Visual Basic

C#

C++

Web Developer

速成版

主题不适用 主题不适用

仅限本机

主题不适用

标准版

主题不适用 主题不适用

仅限本机

主题不适用

专业团队版

主题不适用 主题不适用

仅限本机

主题不适用

表格图例:

主题适用

适用

主题不适用

不适用

主题适用,但命令默认情况下隐藏

默认情况下隐藏的一条或多条命令。

说明:

显示的对话框和菜单命令可能会与“帮助”中的描述不同,具体取决于您的当前设置或版本。若要更改设置,请在“工具”菜单上选择“导入和导出设置”。有关更多信息,请参见 Visual Studio 设置

本主题显示如何拍内存快照以帮助定位内存泄漏。

检测内存泄漏

  1. 创建一个 CMemoryState Members 对象并调用 CMemoryState::Checkpoint 成员函数。这将创建第一个内存快照。

  2. 在程序执行了其内存分配和释放操作以后,创建另一个 CMemoryState 对象,并为该对象调用 Checkpoint。这将得到内存使用的第二个快照。

  3. 创建第三个 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查看内存统计信息,该统计数据将有助于对其进行定位。

请参见

参考

_DEBUG

其他资源

MFC 中的内存泄漏检测