2016-12-07 2 views
0

Schauen Sie sich die einfachste Anwendung:Speicherlecks in 0 Codezeilen.

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

void main(void) 
{ 
    _CrtDumpMemoryLeaks(); 
} 

er die nächste Ausgabe im Debug-Fensterbereich erzeugt:

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! wie ist es möglich?
Win10, VS2015, Zielplattform Version 10.0.14393.0

+2

Wahrscheinlich einige statisch-scoped Objekte, die die Laufzeit-C-Bibliothek intern sind und ausgebildet sind, wenn die C Bibliothek initialisiert. Nicht wirklich ein Speicherleck. –

+0

Wahrscheinlich werden falsche Positive von einem Objekt, das durch die Laufzeit erzeugt wird, nicht zerstört, wenn es nach Lecks sucht. – NathanOliver

+0

Warum kümmert es dich? Sie sind dabei, Ihre Anwendung zu beenden. Sobald Ihr Prozess existiert, gibt es kein Speicherleck mehr, es sei denn, das Betriebssystem selbst ist fehlerhaft. Wenn der Prozess beendet wird, wird der gesamte Speicher automatisch freigegeben. Nichts, was Sie in Ihrem Code tun, wird das ändern. –

Antwort

0

I "fixed" dies mit folgenden Manipulationen:

  1. stdlib Prüfung Lassen und Speicherlecks von selbst zeigen, bevor Ausfahrt
     
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 
    
  2. Um zu sehen, ich die Nachricht setzen Punkt brechen in exit.cpp:129 auf
     
    ExitProcess(return_code); 
    

Der Ergebniscode:

#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 
} 

Jetzt kann ich nur MY Speicherlecks im Debug-Fenster angezeigt!

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.

Dank @JamesBean und MSDN article "Finding Memory Leaks Using the CRT Library"