Interpretazione di dump di oggetti

Le informazioni contenute in questo argomento sono valide per:

Edizione

Visual Basic

C#

F#

C++

Web Developer

Express

Argomento non applicabile Argomento non applicabile Argomento non applicabile

Solo nativo

Argomento non applicabile

Pro, Premium e Ultimate

Argomento non applicabile Argomento non applicabile Argomento non applicabile

Solo nativo

Argomento non applicabile

Considerare questo dump di oggetti in maggior dettaglio:

{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

Nel programma che ha generato questo dump erano presenti solo due allocazioni esplicite, una sullo stack e una sull'heap:

// Do your memory allocations and deallocations.
CString s("This is a frame variable");
// The next object is a heap object.
CPerson* p = new CPerson( "Smith", "Alan", "581-0215" );

Il costruttore CPerson accetta tre argomenti che rappresentano puntatori a char, utilizzati per inizializzare variabili membro CString. Nel dump della memoria è possibile individuare l'oggetto CPerson nonché tre blocchi non di oggetti (3, 4 e 5). Questi blocchi contengono i caratteri delle variabili membro CString e non verranno eliminati quando sarà chiamato il distruttore dell'oggetto CPerson.

Il blocco il numero 2 è l'oggetto CPerson stesso. $51A4 rappresenta l'indirizzo del blocco ed è seguito dal contenuto dell'oggetto, restituito come output da CPerson::Dump quando è stato chiamato da DumpAllObjectsSince.

È chiaro che il blocco numero 1 è associato alla variabile di frame CString, in quanto presenta una sequenza di numero e dimensione che corrisponde al numero di caratteri della variabile di frame CString. Le variabili allocate sul frame vengono automaticamente disallocate quando il frame esce dall'ambito consentito.

Variabili di frame

In generale gli oggetti degli heap associati a variabili di frame non devono destare preoccupazioni, poiché vengono automaticamente disallocati quando le variabili di frame escono dall'ambito consentito. Per far sì che i dump di diagnostica della memoria non siano eccessivamente ingombranti, è opportuno inserire le chiamate a Checkpoint in modo che restino all'esterno dell'ambito delle variabili di frame. Inserire, ad esempio, il precedente codice di allocazione tra parentesi indicanti l'ambito, come illustrato di seguito:

oldMemState.Checkpoint();
{
    // Do your memory allocations and deallocations ...
    CString s("This is a frame variable");
    // The next object is a heap object.
    CPerson* p = new CPerson( "Smith", "Alan", "581-0215" );
}
newMemState.Checkpoint();

Dopo l'inserimento delle parentesi di ambito, il dump della memoria di questo esempio sarà il seguente:

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

Allocazioni di non oggetti

Si noti che alcune allocazioni sono di oggetti (ad esempio CPerson) mentre altre sono allocazioni di non oggetti. Queste ultime sono allocazioni di oggetti non derivati da CObject o allocazioni di tipi C primitivi, ad esempio char, int o long. Se la classe derivata da CObject- alloca ulteriore spazio, ad esempio per buffer interni, questi oggetti presenteranno allocazioni di oggetti e di non oggetti.

Prevenzione di perdite di memoria

Si noti che nel codice precedente il blocco di memoria associato alla variabile di frame CString è stato disallocato automaticamente e non appare quindi come una perdita di memoria. La disallocazione automatica associata alle regole di ambito gestisce la maggior parte delle perdite di memoria associati alle variabili di frame.

Per gli oggetti allocati sull'heap, tuttavia, è necessario eliminare esplicitamente l'oggetto per impedire una perdita di memoria. Per eliminare l'ultima perdita di memoria dell'esempio precedente, eliminare l'oggetto CPerson allocato sull'heap, come segue:

{
    // Do your memory allocations and deallocations.
    CString s("This is a frame variable");
    // The next object is a heap object.
    CPerson* p = new CPerson( "Smith", "Alan", "581-0215" );
    delete p;
}

Vedere anche

Riferimenti

_CrtMemDumpAllObjectsSince

Concetti

Dump di oggetti

Altre risorse

Rilevamento di perdite di memoria in MFC