Udostępnij za pośrednictwem


Struktura CMemoryState

Zapewnia wygodny sposób wykrywania przecieków pamięci w programie.

Składnia

struct CMemoryState

Członkowie

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 i delete 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ć Checkpointfunkcji , Differencei 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 pliku projnameApp.cpp. 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.

Zobacz też

Wykres hierarchii