Struktura CMemoryState
Zapewnia wygodny sposób wykrywania przecieków pamięci w programie.
Składnia
struct CMemoryState
Elementy członkowskie
Konstruktory publiczne
Nazwa/nazwisko | opis |
---|---|
CMemoryState::CMemoryState | Tworzy strukturę podobną do klasy, która kontroluje punkty kontrolne pamięci. |
Metody publiczne
Nazwa/nazwisko | opis |
---|---|
CMemoryState::Checkpoint | Uzyskuje migawkę (punkt kontrolny) bieżącego stanu pamięci. |
CMemoryState::D ifference | Oblicza różnicę między dwoma obiektami typu CMemoryState . |
CMemoryState::D umpAllObjectsSince | Zrzuty podsumowanie wszystkich aktualnie przydzielonych obiektów od poprzedniego punktu kontrolnego. |
CMemoryState::D umpStatistics | Drukuje statystyki alokacji pamięci dla CMemoryState obiektu. |
Uwagi
CMemoryState
jest strukturą i nie ma klasy bazowej.
Występuje "przeciek pamięci", gdy pamięć dla obiektu jest przydzielana na stercie, ale nie jest cofnięta, gdy nie jest już wymagana. Takie przecieki pamięci mogą ostatecznie prowadzić do błędów braku pamięci. Istnieje kilka sposobów przydzielania i cofania przydziału pamięci w programie:
malloc
/free
Korzystanie z rodziny funkcji z biblioteki czasu wykonywania.Przy użyciu funkcji
LocalAlloc
/LocalFree
zarządzania pamięcią interfejsu API systemu Windows i .GlobalAlloc
/GlobalFree
Używanie języka C++
new
idelete
operatorów.
Diagnostyka CMemoryState
pomaga wykrywać przecieki pamięci spowodowane tylko tym, że pamięć przydzielona przy użyciu new
operatora nie została cofniętą przydział przy użyciu polecenia delete
. Pozostałe dwie grupy funkcji zarządzania pamięcią są przeznaczone dla programów innych niż C++, a mieszanie ich z new
programem i delete
w tym samym programie nie jest zalecane. Dodatkowe makro, DEBUG_NEW, jest udostępniane do zastąpienia new
operatora, gdy potrzebujesz pliku i numeru wiersza śledzenia alokacji pamięci. DEBUG_NEW jest używany za każdym razem, gdy zwykle używa new
się operatora .
Podobnie jak w przypadku innych diagnostyki, diagnostyka CMemoryState
jest dostępna tylko w wersjach debugowania programu. Wersja debugowania musi mieć zdefiniowaną stałą _DEBUG.
Jeśli podejrzewasz, że program ma przeciek pamięci, możesz użyć Checkpoint
funkcji , Difference
i DumpStatistics
, aby wykryć różnicę między stanem pamięci (przydzielonymi obiektami) w dwóch różnych punktach wykonywania programu. Te informacje mogą być przydatne podczas określania, czy funkcja czyści wszystkie przydzielane obiekty.
Jeśli po prostu wiedząc, gdzie dysproporcja alokacji i cofania się nie zapewnia wystarczającej ilości informacji, możesz użyć DumpAllObjectsSince
funkcji do zrzutu wszystkich obiektów przydzielonych od poprzedniego wywołania metody Checkpoint
. Ten zrzut pokazuje kolejność alokacji, plik źródłowy i wiersz, w którym przydzielono obiekt (jeśli używasz DEBUG_NEW do alokacji) oraz wyprowadzenie obiektu, jego adresu i jego rozmiaru. DumpAllObjectsSince
Wywołuje również funkcję każdego obiektu Dump
, aby dostarczyć informacje o jego bieżącym stanie.
Aby uzyskać więcej informacji na temat używania CMemoryState
i innych diagnostyki, zobacz Debugowanie aplikacji MFC.
Uwaga
Deklaracje obiektów typu CMemoryState
i wywołań funkcji składowych powinny być w nawiasach według #if defined(_DEBUG)/#endif
dyrektyw. Powoduje to uwzględnianie diagnostyki pamięci tylko w kompilacjach debugowania programu.
Hierarchia dziedziczenia
CMemoryState
Wymagania
Nagłówek: afx.h
CMemoryState::Checkpoint
Tworzy podsumowanie migawki pamięci i zapisuje je w tym CMemoryState
obiekcie.
void Checkpoint();
Uwagi
Funkcje CMemoryState
składowe Difference i DumpAllObjectsSince używają tych danych migawki.
Przykład
Zobacz przykład konstruktora CMemoryState .
CMemoryState::CMemoryState
Tworzy pusty CMemoryState
obiekt, który musi być wypełniony przez funkcję elementu członkowskiego Checkpoint lub Difference .
CMemoryState();
Przykład
CMemoryState msOld;
msOld.Checkpoint();
CPerson* pper1 = new CPerson();
CPerson* pper2 = new CPerson();
msOld.DumpAllObjectsSince();
CMemoryState::D ifference
Porównuje dwa CMemoryState
obiekty, a następnie przechowuje różnicę w tym CMemoryState
obiekcie.
BOOL Difference(
const CMemoryState& oldState,
const CMemoryState& newState);
Parametry
oldState
Początkowy stan pamięci zdefiniowany przez CMemoryState
punkt kontrolny.
newState
Nowy stan pamięci zdefiniowany przez CMemoryState
punkt kontrolny.
Wartość zwracana
Niezerowe, jeśli dwa stany pamięci są różne; w przeciwnym razie 0.
Uwagi
Punkt kontrolny musi być wywoływany dla każdego z dwóch parametrów stanu pamięci.
Przykład
Zobacz przykład konstruktora CMemoryState .
CMemoryState::D umpAllObjectsSince
Dump
Wywołuje funkcję dla wszystkich obiektów typu pochodzącego z klasyCObject
, które zostały przydzielone (i są nadal przydzielone) od ostatniego wywołania punktu kontrolnego dla tego CMemoryState
obiektu.
void DumpAllObjectsSince() const;
Uwagi
Wywołanie DumpAllObjectsSince
z niezainicjowanym CMemoryState
obiektem spowoduje zrzucenie wszystkich obiektów znajdujących się obecnie w pamięci.
Przykład
Zobacz przykład konstruktora CMemoryState .
CMemoryState::D umpStatistics
Drukuje zwięzły raport statystyk pamięci z CMemoryState
obiektu wypełnionego przez funkcję składową Difference .
void DumpStatistics() const;
Uwagi
Raport wydrukowany na urządzeniu afxDump przedstawia następujące elementy:
Przykładowy raport zawiera informacje o liczbie (lub ilości):
bloki wolne
bloki normalne
Bloki CRT
ignoruj bloki
bloki klienta
maksymalna ilość pamięci używanej przez program w dowolnym momencie (w bajtach)
całkowita ilość pamięci aktualnie używanej przez program (w bajtach)
Wolne bloki to liczba bloków, których cofanie przydziału zostało opóźnione, jeśli afxMemDF
ustawiono wartość delayFreeMemDF
. Aby uzyskać więcej informacji, zobacz afxMemDF w sekcji "Makra i globalne MFC".
Przykład
Poniższy kod powinien zostać umieszczony w App.cpp projname. Zdefiniuj następujące zmienne globalne:
static CMemoryState oldstate, newstate, diffstate;
InitInstance
W funkcji dodaj wiersz:
oldstate.Checkpoint();
Dodaj procedurę obsługi dla ExitInstance
funkcji i użyj następującego kodu:
newstate.Checkpoint();
if (diffstate.Difference(oldstate, newstate))
{
TRACE(_T("Memory leaked\n"));
diffstate.DumpStatistics();
}
Teraz możesz uruchomić program w trybie debugowania, aby wyświetlić dane wyjściowe DumpStatistics
funkcji.