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.
Fornisce un modo pratico per rilevare perdite di memoria nel programma.
Sintassi
struct CMemoryState
Membri
Costruttori pubblici
| Nome | Descrizione |
|---|---|
| CMemoryState::CMemoryState | Costruisce una struttura simile alla classe che controlla i checkpoint di memoria. |
Metodi pubblici
| Nome | Descrizione |
|---|---|
| CMemoryState::Checkpoint | Ottiene uno snapshot (checkpoint) dello stato di memoria corrente. |
| CMemoryState::D ifference | Calcola la differenza tra due oggetti di tipo CMemoryState. |
| CMemoryState::D umpAllObjectsSince | Esegue il dump di un riepilogo di tutti gli oggetti attualmente allocati dopo un checkpoint precedente. |
| CMemoryState::D umpStatistics | Stampa le statistiche di allocazione della memoria per un CMemoryState oggetto . |
Osservazioni:
CMemoryState è una struttura e non dispone di una classe di base.
Una "perdita di memoria" si verifica quando la memoria per un oggetto viene allocata nell'heap, ma non deallocata quando non è più necessaria. Tali perdite di memoria possono causare alla fine errori di memoria insufficiente. Esistono diversi modi per allocare e deallocare memoria nel programma:
Uso della
malloc/freefamiglia di funzioni dalla libreria di runtime.Uso delle funzioni
LocalAlloc/LocalFreedi gestione della memoria dell'API Windows e .GlobalAlloc/GlobalFreeUso degli operatori e
deleteC++new.
La CMemoryState diagnostica consente di rilevare solo le perdite di memoria causate quando la memoria allocata tramite l'operatore new non viene deallocata tramite delete. Gli altri due gruppi di funzioni di gestione della memoria sono destinati a programmi non C++ e non sono consigliati combinarli con new e delete nello stesso programma. Viene fornita una macro aggiuntiva, DEBUG_NEW, per sostituire l'operatore new quando è necessario tenere traccia delle allocazioni di memoria di file e numeri di riga. DEBUG_NEW viene usato ogni volta che si usa normalmente l'operatore new .
Come per altre diagnostica, la CMemoryState diagnostica è disponibile solo nelle versioni di debug del programma. Una versione di debug deve avere la costante _DEBUG definita.
Se si sospetta che il programma abbia una perdita di memoria, è possibile usare le Checkpointfunzioni , Differencee DumpStatistics per individuare la differenza tra lo stato della memoria (oggetti allocati) in due punti diversi nell'esecuzione del programma. Queste informazioni possono essere utili per determinare se una funzione pulisce tutti gli oggetti allocati.
Se è sufficiente sapere dove si verifica lo squilibrio nell'allocazione e la deallocazione non fornisce informazioni sufficienti, è possibile usare la funzione per eseguire il DumpAllObjectsSince dump di tutti gli oggetti allocati dopo la chiamata precedente a Checkpoint. Questo dump mostra l'ordine di allocazione, il file di origine e la riga in cui è stato allocato l'oggetto (se si usa DEBUG_NEW per l'allocazione) e la derivazione dell'oggetto, del relativo indirizzo e delle relative dimensioni. DumpAllObjectsSince chiama anche la funzione di Dump ogni oggetto per fornire informazioni sullo stato corrente.
Per altre informazioni su come usare CMemoryState e altre funzionalità di diagnostica, vedere Debug di applicazioni MFC.
Nota
Le dichiarazioni di oggetti di tipo CMemoryState e chiamate alle funzioni membro devono essere racchiuse tra parentesi per #if defined(_DEBUG)/#endif direttive. In questo modo, la diagnostica della memoria deve essere inclusa solo nelle compilazioni di debug del programma.
Gerarchia di ereditarietà
CMemoryState
Requisiti
Intestazione: afx.h
CMemoryState::Checkpoint
Acquisisce un riepilogo dello snapshot della memoria e lo archivia in questo CMemoryState oggetto.
void Checkpoint();
Osservazioni:
Le CMemoryState funzioni membro Difference e DumpAllObjectsSince usano questi dati snapshot.
Esempio
Vedere l'esempio per il costruttore CMemoryState .
CMemoryState::CMemoryState
Costruisce un oggetto vuoto CMemoryState che deve essere compilato dalla funzione membro Checkpoint o Difference .
CMemoryState();
Esempio
CMemoryState msOld;
msOld.Checkpoint();
CPerson* pper1 = new CPerson();
CPerson* pper2 = new CPerson();
msOld.DumpAllObjectsSince();
CMemoryState::D ifference
Confronta due CMemoryState oggetti, quindi archivia la differenza in questo CMemoryState oggetto.
BOOL Difference(
const CMemoryState& oldState,
const CMemoryState& newState);
Parametri
oldState
Stato di memoria iniziale definito da un CMemoryState checkpoint.
newState
Nuovo stato di memoria definito da un CMemoryState checkpoint.
Valore restituito
Diverso da zero se i due stati di memoria sono diversi; in caso contrario, 0.
Osservazioni:
Il checkpoint deve essere stato chiamato per ognuno dei due parametri dello stato della memoria.
Esempio
Vedere l'esempio per il costruttore CMemoryState .
CMemoryState::D umpAllObjectsSince
Chiama la Dump funzione per tutti gli oggetti di un tipo derivato dalla classe CObject allocata (e sono ancora allocati) dall'ultima chiamata checkpoint per questo CMemoryState oggetto.
void DumpAllObjectsSince() const;
Osservazioni:
La chiamata DumpAllObjectsSince con un oggetto non inizializzato CMemoryState eseguirà il dump di tutti gli oggetti attualmente in memoria.
Esempio
Vedere l'esempio per il costruttore CMemoryState .
CMemoryState::D umpStatistics
Stampa un rapporto di statistiche di memoria conciso da un CMemoryState oggetto compilato dalla funzione membro Difference .
void DumpStatistics() const;
Osservazioni:
Il report, stampato nel dispositivo afxDump , mostra quanto segue:
Un report di esempio fornisce informazioni sul numero (o sulla quantità) di:
blocchi liberi
blocchi normali
Blocchi CRT
ignorare i blocchi
blocchi client
memoria massima utilizzata dal programma in qualsiasi momento (in byte)
memoria totale attualmente usata dal programma (in byte)
I blocchi liberi sono il numero di blocchi la cui deallocazione è stata ritardata se afxMemDF è stata impostata su delayFreeMemDF. Per altre informazioni, vedere afxMemDF, nella sezione "Macro e globali MFC".
Esempio
Il codice seguente deve essere inserito in projnameApp.cpp. Definire le variabili globali seguenti:
static CMemoryState oldstate, newstate, diffstate;
InitInstance Nella funzione aggiungere la riga:
oldstate.Checkpoint();
Aggiungere un gestore per la ExitInstance funzione e usare il codice seguente:
newstate.Checkpoint();
if (diffstate.Difference(oldstate, newstate))
{
TRACE(_T("Memory leaked\n"));
diffstate.DumpStatistics();
}
È ora possibile eseguire il programma in modalità debug per visualizzare l'output della DumpStatistics funzione.