对象转储

本主题适用于:

版本

Visual Basic

C#

F#

C++

Web Developer

学习版

主题不适用 主题不适用 主题不适用

仅限本机

主题不适用

专业版、高级专业版和旗舰版

主题不适用 主题不适用 主题不适用

仅限本机

主题不适用

在 MFC 程序中,可以使用 CMemoryState::DumpAllObjectsSince 来转储堆上尚未释放的所有对象的描述。 DumpAllObjectsSince 转储从最后一个 CMemoryState::Checkpoint 以来分配的所有对象。 如果未发生 Checkpoint 调用,则 DumpAllObjectsSince 将转储当前在内存中的所有对象和非对象。

提示

必须先启用如何:启用内存诊断,然后才能使用 MFC 对象转储。

提示

程序退出时 MFC 将自动转储所有泄漏的对象,因此不必创建代码在该点转储对象。

以下代码通过比较两个内存状态来测试内存泄漏,并在检测到泄漏时转储所有对象。

旧代码示例

if( diffMemState.Difference( oldMemState, newMemState ) )
{
   TRACE( "Memory leaked!\n" );
   diffMemState.DumpAllObjectsSince();
}

转储的内容如下所示:

Dumping objects ->

{5} strcore.cpp(80) : non-object block at $00A7521A, 9 bytes long
{4} strcore.cpp(80) : non-object block at $00A751F8, 5 bytes long
{3} strcore.cpp(80) : non-object block at $00A751D6, 6 bytes long
{2} a CPerson at $51A4

Last Name: Smith
First Name: Alan
Phone #: 581-0215

{1} strcore.cpp(80) : non-object block at $00A7516E, 25 bytes long

可靠编程

大多数行开始处的大括号中的数字指定对象的分配顺序。 最近分配的对象具有最高编号,并显示在转储的顶部。 有关此示例的详细分析,请参见对象转储转译

若要从对象转储获取最大信息量,可以重写 CObject 派生的任何对象的 Dump 成员函数,以自定义对象转储

通过将全局变量 _afxBreakAlloc 设置为大括号中显示的数字,可以在特定内存分配上设置断点。 如果重新运行程序,调试器将在该分配发生时中断执行。 然后可以查看调用堆栈,以了解程序是怎样到达该点的。

C 运行库有一个类似的函数 _CrtSetBreakAlloc,可用于 C 运行时分配。

请参见

其他资源

MFC 中的内存泄漏检测