2016-12-07 48 views
0

看看這個簡單的應用:內存泄漏0行代碼。

#define _CRTDBG_MAP_ALLOC 
#include <stdlib.h> 
#include <crtdbg.h> 

void main(void) 
{ 
    _CrtDumpMemoryLeaks(); 
} 

它產生在調試窗格中的下一個輸出:

Detected memory leaks! 
Dumping objects -> 
{94} normal block at 0x012EA298, 8 bytes long. 
Data: <Dw  > 44 77 D9 00 00 00 00 00 
{93} normal block at 0x012F0DA8, 20 bytes long. 
Data: </// > A8 0D 2F 01 A8 0D 2F 01 A8 0D 2F 01 01 01 CD CD 
Object dump complete. 

Detected memory leaks!怎麼可能?
Win10,VS2015,目標平臺版本10.0.14393.0

+2

最有可能的一些是內部的運行時C庫,和被構造當C靜態範圍的對象庫初始化。不是真的內存泄漏。 –

+0

由運行時創建的對象可能產生的誤報在檢查泄漏時未被銷燬。 – NathanOliver

+0

你爲什麼在意?您即將退出您的應用程序。一旦你的進程存在,就沒有內存泄漏這樣的事情,除非操作系統本身就是bug。當進程終止時,它所分配的所有內存都會自動釋放。你在代碼中做的任何事情都不會改變這一點。 –

回答

0

我 「固定」 這跟接下來的操作:

  1. stdlib檢查並退出前通過展示自己的內存泄漏
     
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 
    
  2. 要查看我把訊息放在exit.cpp:129exit.cpp:129
     
    ExitProcess(return_code); 
    

結果代碼:

#define _CRTDBG_MAP_ALLOC 
#include <stdlib.h> 
#include <crtdbg.h> 

void main(void) 
{ 
    // Show memory leaks before exit 
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 
    auto a = new int[33333]; 
    //_CrtDumpMemoryLeaks(); // DO NOT USE 
} 

現在我可以看到在調試窗格中僅MY內存泄漏!

Detected memory leaks! 
Dumping objects -> 
{95} normal block at 0x014B4F48, 133332 bytes long. 
Data: <    > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD 
Object dump complete. 

33333 * 4 = 133332.

由於@JamesBean和MSDN article "Finding Memory Leaks Using the CRT Library"