2015-06-03 17 views
8

Voglio controllare il mio programma per perdite di memoria e trovato this Microsoft article.Rilevamento perdite di memoria di Visual Studio non stampa nome file e numero linea

Ho apprezzato seguito l'articolo e ha aggiunto

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

e

_CrtDumpMemoryLeaks(); 

quando il programma termina.

E discariche correttamente tutte le informazioni perdita di memoria nella mia finestra di uscita, ma ecco il problema:

non stampa il nome del file e il numero di riga in cui le perdite di memoria sono!

Si dice nell'articolo che con #define _CRTDBG_MAP_ALLOC stampa il nome del file e il numero di riga, ma non fa per me.

La mia uscita si presenta così

Detected memory leaks! 
Dumping objects -> 
{3456} normal block at 0x038F81E8, 560 bytes long. 
Data: <  A  B> 00 00 00 00 00 00 10 41 00 00 00 FF 00 00 E6 42 
{3447} normal block at 0x038F8170, 56 bytes long. 
Data: < B ^B  > 80 42 90 03 10 02 5E 08 80 42 90 03 00 00 CD CD 
{3440} normal block at 0x038F86B0, 840 bytes long. 
Data: <  A  B> 00 00 00 00 00 00 10 41 00 00 00 FF 00 00 A8 42 
... 

quindi non posso davvero lavorare con quel ... anche premendo F4 per passare alla riga non funziona.

Potrebbe aiutarmi per favore?

+0

Se hai una build di debug, provare a eseguire l'applicazione in [Application Verifier] (https://www.microsoft.com/en-us/download/details.aspx?id=20028) – rrirower

risposta

0

Sembra che ci sia un errore di battitura nell'esempio della documentazione VS2013 in alto. Dovrebbe essere:

#define _CRTDBG_MAP_ALLOC 

Annotare la sottolineatura iniziale. Il documento VS2005/2008 utilizza _CRTDBG_MAP_ALLOC e il documento VS2013 fa riferimento a _CRTDBG_MAP_ALLOC in seguito.

A poche altre cose che si possono controllare:

  • Assicurarsi di essere nel debug
  • Clean/ricostruire la vostra applicazione
  • Se si utilizza un'intestazione precompilata assicurarsi di aggiungere il _CRTDBG_MAP_ALLOC definizione a stdafx.h
+2

Ho provato anche quello ma non mostrerà ancora il nome del file e il numero di riga –

1

Si #define è errato. Al fine di ottenere il formato di

Detected memory leaks! 
Dumping objects -> 
C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18} 
normal block at 0x00780E80, 64 bytes long. 
Data: <    > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD 
Object dump complete. 

È necessario utilizzare:

#define _DEBUG 
#define _CRTDBG_MAP_ALLOC 

è necessario includere _DEBUG pure poiché _CRTDBG_MAP_ALLOC è disponibile solo con _DEBUG definito (source). Anche da questo answer assicurarsi che il #define sia nel file cpp che si desidera controllare.

0

Spero che questo aiuti se non hai capito @ A.D, funziona per le applicazioni win32, abbiamo bisogno di scavalcare il nuovo operatore. sfortunatamente non funziona per l'applicazione MFC.:(

#define _CRTDBG_MAP_ALLOC 
#include<iostream> 
#include <crtdbg.h> 
#ifdef _DEBUG 
    #define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) 
    #define new DEBUG_NEW 
#endif 
int main() 
{ 
_CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF) ; 
char *a = new char[10]; 
return 0; 
}