Procedura: impostare punti di interruzione su un numero di allocazione della 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.

Nota:

Le finestre di dialogo e i comandi di menu visualizzati possono differire da quelli descritti nella Guida a seconda delle impostazioni attive o dell'edizione in uso. Per modificare le impostazioni, scegliere Importa/Esporta impostazioni dal menu Strumenti. Per ulteriori informazioni, vedere Impostazioni di Visual Studio.

Il nome file e il numero di riga specificati nel report della perdita di memoria indicano il punto in cui è allocata la memoria persa. Queste informazioni, tuttavia, possono non essere sufficienti per identificare il problema. Spesso un'allocazione viene chiamata più volte durante un'esecuzione del programma, ma la perdita di memoria può verificarsi solo su determinate chiamate. Per identificare il problema, occorre conoscere non solo la posizione in cui è allocata la memoria persa, ma anche le condizioni in cui si verifica la perdita. Le informazioni necessarie a tal fine sono rappresentate dal numero di allocazione della memoria. Si tratta del numero riportato tra parentesi dopo il nome file e il numero di riga. Nell'output riportato di seguito, ad esempio, il numero di allocazione della memoria è 18. La memoria persa è quindi il 18º blocco di memoria allocato nel programma.

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.

La libreria CRT conta tutti i blocchi di memoria allocati durante un'esecuzione del programma, inclusa la memoria allocata dalla libreria CRT stessa o da altre librerie, ad esempio MFC. Pertanto, un oggetto con numero di allocazione N sarà l'N-esimo oggetto allocato nel programma ma non necessariamente l'N-esimo oggetto allocato dal codice. Nella maggior parte dei casi non lo è.

È possibile utilizzare il numero di allocazione per impostare un punto di interruzione nella posizione in cui è allocata la memoria. Per far questo, impostare un punto di interruzione della posizione vicino all'inizio del programma. Quando il programma si interrompe, il punto di interruzione dell'allocazione di memoria corrispondente potrà essere impostato nella finestra di dialogo Controllo immediato o nella finestra Espressioni di controllo.

Procedura

Per impostare un punto di interruzione dell'allocazione di memoria nella finestra Espressioni di controllo

  1. Nella finestra Espressioni di controllo digitare la seguente espressione nella colonna Nome:

    _crtBreakAlloc
    

    Se si utilizza la versione DLL multithread della libreria CRT (l'opzione /MD), includere l'operatore di contesto, come indicato di seguito:

    {,,msvcr71d.dll}_crtBreakAlloc
    
  2. Premere INVIO.

    Il debugger valuterà la chiamata e ne visualizzerà il risultato nella colonna Valore. Questo valore sarà –1 se non è stato impostato alcun punto di interruzione su allocazioni di memoria.

  3. Sostituire il valore contenuto nella colonna Valore con il numero dell'allocazione di memoria in cui si desidera operare l'interruzione. Specificare, ad esempio, il numero 18 per effettuare l'interruzione in corrispondenza dell'allocazione indicata nell'output riportato in precedenza.

Dopo aver impostato i punti di interruzione sulle allocazioni di memoria desiderate, è possibile continuare il debug. Fare attenzione a eseguire il programma nelle stesse condizioni dell'esecuzione precedente, in modo che l'ordine di allocazione non venga modificato. Quando il programma viene interrotto nell'allocazione di memoria specificata, è possibile esaminare la finestra Stack di chiamate e altre informazioni visualizzate dal debugger per determinare in quali condizioni la memoria è stata allocata. Se necessario, sarà possibile continuare l'esecuzione del programma da tale punto per osservare le operazioni eseguite relative all'oggetto e riuscire eventualmente a determinare le cause della disallocazione non corretta.

Nota:

Può essere utile impostare un punto di interruzione dei dati sull'oggetto. Per ulteriori informazioni, vedere Procedura: impostare un punto di interruzione di dati (solo nativo).

Sebbene sia in genere più facile impostare punti di interruzione dell'allocazione di memoria nel debugger, è possibile impostarli anche nel codice, se si preferisce.

Per impostare un punto di interruzione dell'allocazione di memoria nel codice

  • Aggiungere una riga analoga alla seguente (per la diciottesima allocazione di memoria):

    _crtBreakAlloc = 18;
    

In alternativa è possibile utilizzare la funzione _CrtSetBreakAlloc, che ha lo stesso effetto:

_CrtSetBreakAlloc(18);

Vedere anche

Attività

Procedura: utilizzare la finestra Stack di chiamate

Concetti

Rilevamento e isolamento di perdite di memoria

Altre risorse

Finestre delle variabili