Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Aggiornamento: novembre 2007
Le informazioni contenute in questo argomento sono valide per:
Edition |
Visual Basic |
C# |
C++ |
Web Developer |
|---|---|---|---|---|
Express |
![]() |
![]() |
Solo nativo |
![]() |
Standard |
![]() |
![]() |
Solo nativo |
![]() |
Pro e Team |
![]() |
![]() |
Solo nativo |
![]() |
Legenda tabella:
![]() |
Si applica |
![]() |
Non applicabile |
![]() |
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.
.gif)
.gif)
.gif)
Nota: