Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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/freeKorzystanie z rodziny funkcji z biblioteki czasu wykonywania.Przy użyciu funkcji
LocalAlloc/LocalFreezarządzania pamięcią interfejsu API systemu Windows i .GlobalAlloc/GlobalFreeUżywanie języka C++
newideleteoperatoró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 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.