MFC诊断问题

MFC诊断问题,mfc,memory-leaks,Mfc,Memory Leaks,所以我放弃了实现自己的memoryleak跟踪(在这个问题中),尝试使用MFC函数来识别内存泄漏。 所以我做的正是这里描述的: 这是我的代码: #ifdef _DEBUG CMemoryState oldMemState, newMemState, diffMemState; oldMemState.Checkpoint(); #endif int* test = new int; #ifdef _DEBUG newMemState.Checkpoint()

所以我放弃了实现自己的memoryleak跟踪(在这个问题中),尝试使用MFC函数来识别内存泄漏。 所以我做的正是这里描述的:

这是我的代码:

#ifdef _DEBUG
    CMemoryState oldMemState, newMemState, diffMemState;
    oldMemState.Checkpoint();
#endif

    int* test = new int;

#ifdef _DEBUG
    newMemState.Checkpoint();
    if( diffMemState.Difference( oldMemState, newMemState ) )
    {
        TRACE( "Memory leaked!\n" );
        diffMemState.DumpStatistics();
        diffMemState.DumpAllObjectsSince();
    }
#endif
但不是输出任何有用的信息,而是显示

    Memory leaked!
        0 bytes in 0 Free Blocks.
        4 bytes in 1 Normal Blocks.
        0 bytes in 0 CRT Blocks.
        0 bytes in 0 Ignore Blocks.
        0 bytes in 0 Client Blocks.
        Largest number used: 0 bytes.
        Total allocations: 4 bytes.
        Dumping objects ->
    {714538} normal block at 0x029628C8, 4 bytes long.
Data: <    > CD CD CD CD 
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp(306) : {714536} client block at 0x022F6040, subtype c0, 68 bytes long.
  a CWinThread object at $022F6040, 68 bytes long
    {714535} normal block at 0x03B607A8, 4 bytes long.
Data: <@`/ > 40 60 2F 02 
    {714534} normal block at 0x03B58C70, 8 bytes long.
Data: < N      > F0 4E B5 03 00 00 00 00 
    {714533} client block at 0x03B54EF0, subtype c0, 12 bytes long.
    a CEvent object at $03B54EF0, 12 bytes long
    {714524} normal block at 0x022FFFC8, 1 bytes long.
Data: < > CD 
    {714523} normal block at 0x03B608C0, 12 bytes long.
Data: <    x   h   > E8 07 B6 03 78 08 B6 03 68 97 9A 02 
    {714522} normal block at 0x03B60878, 12 bytes long.
Data: <    0   P   > C0 08 B6 03 30 08 B6 03 50 82 9A 02 
    {714521} normal block at 0x03B60830, 12 bytes long.
Data: <x           > 78 08 B6 03 E8 07 B6 03 88 81 9A 02 
    {714520} normal block at 0x03B607E8, 12 bytes long.
Data: <0           > 30 08 B6 03 C0 08 B6 03 CD CD CD CD 
    {714515} normal block at 0x03B606B0, 104 bytes long.
Data: <                > 00 00 00 00 CD CD CD CD CD CD CD CD CD CD CD CD 
    {714510} normal block at 0x03B60668, 12 bytes long.
Data: <            > C8 03 B6 03 20 06 B6 03 88 AC 9A 02 
    {714509} normal block at 0x03B60620, 12 bytes long.
Data: <h       h   > 68 06 B6 03 D8 05 B6 03 68 97 9A 02 
内存泄漏!
0个空闲块中有0个字节。
1个普通块中有4个字节。
0个CRT块中有0个字节。
0个忽略块中有0个字节。
0个客户端块中有0个字节。
使用的最大数字:0字节。
总分配:4字节。
转储对象->
0x029628C8处的{714538}正常块,4字节长。
数据:<>CD
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp(306):{714536}位于0x022F6040的客户端块,子类型c0,68字节长。
一个$022F6040、68字节长的CWinThread对象
0x03B607A8处的{714535}正常块,4字节长。
数据:40 60 2F 02
0x03B58C70处的{714534}正常块,8字节长。
数据:F0 4E B5 03 00
0x03B54EF0处的{714533}客户端块,子类型c0,12字节长。
$03B54EF0的CEvent对象,12字节长
0x022FFC8处的{714524}正常块,1字节长。
数据:<>CD
0x03B608C0处的{714523}正常块,12字节长。
数据:E8 07 B6 03 78 08 B6 03 68 97 9A 02
0x03B60878处的{714522}正常块,12字节长。
数据:<0 P>C0 08 B6 03 30 08 B6 03 50 82 9A 02
0x03B60830处的{714521}正常块,12字节长。
资料:78 08 B6 03 E8 07 B6 03 88 81 9A 02
0x03B607E8处的{714520}正常块,12字节长。
数据:30 08 B6 03 C0 08 B6 03 CD
0x03B606B0处的{714515}正常块,104字节长。
数据:<>00张CD
0x03B60668处的{714510}正常块,12字节长。
数据:<>C8 03 B6 03 20 06 B6 03 88 AC 9A 02
0x03B60620处的{714509}正常块,12字节长。
资料:68 06 B6 03 D8 05 B6 03 68 97 9A 02
。。。。。。。。。这是一个又一个的过程,括号里的数字在倒数(实际上,我从来没有耐心等到它倒数到1)

它总是从714538这个高数字开始 那么,我做错了什么

谢谢大家!

从中可以看出,应该对调用Checkpoint()的CMemoryState对象调用DumpAllObjectsSince()

因此,您的代码应该是:

    {
            TRACE( "Memory leaked!\n" );
            diffMemState.DumpStatistics();
            //diffMemState.DumpAllObjectsSince();
            oldMemState.DumpAllObjectsSince();
    }

我相信high number是一个行号。不,根据文档“大多数行开头大括号中的数字指定了对象的分配顺序。最近分配的对象的编号最高,并显示在转储的顶部。”但是在两个检查点之间的堆上只分配了一个int,所以这么高的数字没有意义