Condividi tramite


Dump di oggetti

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.

In un programma MFC è possibile utilizzare CMemoryState::DumpAllObjectsSince per eseguire il dump della descrizione di tutti gli oggetti dell'heap non deallocati. DumpAllObjectsSince esegue il dump di tutti gli oggetti allocati dall'ultima chiamata di CMemoryState::Checkpoint. Se non ha avuto luogo alcuna chiamata Checkpoint, DumpAllObjectsSince effettuerà il dump di tutti gli oggetti e non oggetti attualmente in memoria.

Nota:

Prima di poter utilizzare il dump degli oggetti MFC, è necessario completare la Procedura: attivare la diagnostica della memoria.

Nota:

MFC effettua automaticamente il dump di tutti gli oggetti persi alla chiusura del programma, pertanto non è necessario creare codice per il dump degli oggetti in tale posizione.

Nel codice che segue si verifica la presenza di eventuali perdite di memoria confrontando due stati della memoria e si effettua il dump di tutti gli oggetti eventualmente persi.

Codice di esempio legacy

if( diffMemState.Difference( oldMemState, newMemState ) )
{
   TRACE( "Memory leaked!\n" );
   diffMemState.DumpAllObjectsSince();
}

Il contenuto del dump sarà del seguente tipo:

Dumping objects ->

{5} strcore.cpp(80) : non-object block at $00A7521A, 9 bytes long
{4} strcore.cpp(80) : non-object block at $00A751F8, 5 bytes long
{3} strcore.cpp(80) : non-object block at $00A751D6, 6 bytes long
{2} a CPerson at $51A4

Last Name: Smith
First Name: Alan
Phone #: 581-0215

{1} strcore.cpp(80) : non-object block at $00A7516E, 25 bytes long

Programmazione efficiente

I numeri tra parentesi graffe all'inizio della maggior parte delle righe specificano l'ordine in cui gli oggetti sono stati allocati. L'ultimo oggetto allocato presenta il numero più alto e si trova all'inizio del dump. Per un'analisi più dettagliata di questo esempio, vedere Interpretazione di dump di oggetti.

Per ottenere la massima quantità di informazioni da un dump di oggetti, è possibile eseguire l'override della funzione membro Dump di qualsiasi oggetto derivato da CObject per la Personalizzazione di dump di oggetti.

È possibile definire un punto di interruzione su una particolare allocazione di memoria impostando la variabile globale _afxBreakAlloc sul numero indicato tra le parentesi graffe. Se si esegue nuovamente il programma il debugger interromperà l'esecuzione quando avrà luogo tale allocazione. Sarà quindi possibile esaminare lo stack di chiamate per sapere come il programma è giunto a tale punto.

La libreria di runtime del linguaggio C dispone di una funzione simile, _CrtSetBreakAlloc, che è possibile utilizzare per le allocazioni di runtime del linguaggio C.

Vedere anche

Altre risorse

Rilevamento di perdite di memoria in MFC