Attivazione del rilevamento di perdite di memoria

Aggiornamento: novembre 2007

Le informazioni contenute in questo argomento sono valide per:

Edition

Visual Basic

C#

C++

Web Developer

Express

Argomento non applicabile Argomento non applicabile

Solo nativo

Argomento non applicabile

Standard

Argomento non applicabile Argomento non applicabile

Solo nativo

Argomento non applicabile

Pro e Team

Argomento non applicabile Argomento non applicabile

Solo nativo

Argomento non applicabile

Legenda tabella:

Argomento applicabile

Si applica

Argomento non applicabile

Non applicabile

Argomento valido ma comando nascosto per impostazione predefinita

Comando o comandi nascosti per impostazione predefinita.

I principali strumenti per l'individuazione di perdite di memoria sono il debugger e le funzioni degli heap di debug delle librerie di runtime del linguaggio C (CRT, C Run-Time Libraries). Per attivare le funzioni degli heap di debug, includere le seguenti istruzioni nel programma:

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

Le istruzioni #include devono rispettare l'ordine indicato. Se si modifica l'ordine, è possibile che le funzioni utilizzate non operino correttamente.

Includendo crtdbg.h, le funzioni malloc e free vengono mappate alle corrispondenti versioni di debug, _malloc_dbg e _free_dbg, che tengono traccia dell'allocazione e della disallocazione della memoria. Questa operazione viene eseguita solo in una build di debug (in cui è definito _DEBUG). Le build di rilascio utilizzano le normali funzioni malloc e free.

L'istruzione #define esegue il mapping delle versioni base delle funzioni di heap CRT alle corrispondenti versioni di debug. Questa istruzione non è indispensabile, ma in caso di assenza, il dump delle perdite di memoria conterrà informazioni meno utili.

Una volta aggiunte le istruzioni descritte in precedenza, sarà possibile effettuare il dump delle informazioni sulle perdite di memoria includendo nel programma la seguente istruzione:

_CrtDumpMemoryLeaks();

Quando si esegue il programma nel debugger, _CrtDumpMemoryLeaks visualizza informazioni sulle perdite di memoria nella finestra di output. Le informazioni sulle perdite di memoria sono del seguente tipo:

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.

Se non si utilizza l'istruzione #define _CRTDBG_MAPALLOC, il dump delle perdite di memoria risulterà analogo a quello riportato di seguito:

Detected memory leaks!
Dumping objects ->
{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.

Se non è definito _CRTDBG_MAP_ALLOC, verrà visualizzato quanto segue:

  • Il numero di allocazione della memoria (tra le parentesi graffe).

  • Il tipo di blocco, che può essere normale, client o CRT.

  • La posizione della memoria in formato esadecimale.

  • La dimensione del blocco in byte.

  • Il contenuto dei primi 16 byte in formato esadecimale.

Se è definito _CRTDBG_MAP_ALLOC, verrà inoltre indicato il file in cui è stata allocata la memoria persa. Il numero tra parentesi che segue il nome file (20, in questo esempio) è il numero di riga all'interno del file.

Per passare alla riga del file sorgente in cui è allocata la memoria

  • Fare doppio clic sulla riga nella finestra Output che contiene il nome file e il numero di riga.

    -oppure-

    Selezionare la riga nella finestra Output che contiene il nome file e il numero di riga, quindi premere F4.

_CrtSetDbgFlag

La chiamata di _CrtDumpMemoryLeaks può essere eseguita facilmente se il programma viene chiuso sempre nello stesso punto. Se sono disponibili più punti di chiusura, anziché inserire una chiamata a _CrtDumpMemoryLeaks in ciascun punto, è possibile includere all'inizio del programma la seguente chiamata:

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

Questa istruzione chiama automaticamente _CrtDumpMemoryLeaks alla chiusura del programma. È necessario impostare entrambi i campi di bit, _CRTDBG_ALLOC_MEM_DF e _CRTDBG_LEAK_CHECK_DF, come illustrato in precedenza.

Impostazione della modalità report CRT

Per impostazione predefinita, _CrtDumpMemoryLeaks effettua il dump delle informazioni sulle perdite di memoria nel riquadro Debug della finestra Output, come descritto in precedenza. È possibile modificare questa impostazione, in modo che il dump venga effettuato in un'altra posizione, mediante _CrtSetReportMode. Se si utilizza una libreria, è possibile che essa reimposti l'output in un'altra posizione. In questo caso è possibile impostare nuovamente la posizione dell'output sulla finestra Output utilizzando la seguente istruzione:

_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );

Per ulteriori informazioni, vedere _CrtSetReportMode.

Vedere anche

Concetti

Rilevamento e isolamento di perdite di memoria