2009-12-06 118 views
1

所以我放棄了實施我自己的memoryleak跟蹤(在這個問題overloading new and delete)並嘗試使用MFC函數來識別我的內存泄漏。 所以我做的正是在這裏描述:問題與MFC診斷

http://msdn.microsoft.com/en-us/library/8ky2wh64(VS.80).aspx

這是我的代碼:

#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 

.. .......並且這是正在進行和正在進行,括號內的數字正在倒計時(我實際上從來沒有耐心等待讓它倒數1)

它總是從這個高數714538 所以 - 我做錯了什麼?

謝謝!

+0

我認爲,大量的是行號。 – Synetech 2009-12-06 20:14:43

+0

不,根據文檔「大多數行開頭的大括號中的數字指定了對象的分配順序,最近分配的對象具有最高數字,並且出現在轉儲的頂部。但在兩個檢查點之間只有一個int分配在堆上,所以這麼高的數字沒有意義 – Mat 2009-12-06 21:18:31

回答

1

here它顯示DumpAllObjectsSince()應該在您調用Checkpoint()的CMemoryState對象上調用。

所以,你的代碼應該是:

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

嘿嘿就是這樣:)非常感謝你! – Mat 2009-12-06 22:05:02