对象转储
本主题适用于:
版本 |
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 运行时分配。