CMemoryState Yapısı

Programınızdaki bellek sızıntılarını algılamak için kullanışlı bir yol sağlar.

Sözdizimi

struct CMemoryState

Üyeler

Ortak Oluşturucular

Veri Akışı Adı Açıklama
CMemoryState::CMemoryState Bellek denetim noktalarını denetleyebilen sınıf benzeri bir yapı oluşturur.

Genel Yöntemler

Veri Akışı Adı Açıklama
CMemoryState::Checkpoint Geçerli bellek durumunun anlık görüntüsünü (denetim noktası) alır.
CMemoryState::D ifference türünde CMemoryStateiki nesne arasındaki farkı hesaplar.
CMemoryState::D umpAllObjectsSince Önceki bir denetim noktasından bu yana şu anda ayrılmış olan tüm nesnelerin özetini döküm eder.
CMemoryState::D umpStatistics Bir CMemoryState nesne için bellek ayırma istatistiklerini yazdırır.

Açıklamalar

CMemoryState bir yapıdır ve temel sınıfı yoktur.

Bir nesnenin belleği yığında ayrıldığında ancak artık gerekli olmadığında serbest bırakılmadığında "bellek sızıntısı" oluşur. Bu tür bellek sızıntıları sonunda yetersiz bellek hatalarına yol açabilir. Programınızda bellek ayırmanın ve serbest bırakmanın birkaç yolu vardır:

  • malloc/ free Çalışma zamanı kitaplığındaki işlev ailesini kullanma.

  • Windows API bellek yönetimi işlevlerini LocalAlloc/ LocalFree ve GlobalAlloc/ GlobalFreekullanma.

  • C++ new ve delete işleçlerini kullanma.

Tanılama CMemoryState yalnızca işleci kullanılarak ayrılan bellek kullanılarak deleteserbest bırakılmadığında oluşan bellek sızıntılarını algılamaya new yardımcı olur. Diğer iki bellek yönetimi işlevi grubu C++ olmayan programlara yöneliktir ve bunları new delete ve aynı programda karıştırmak önerilmez. Bellek ayırmalarının dosya ve satır numarası izlemesine ihtiyacınız olduğunda işleci değiştirmek new için ek bir makro (DEBUG_NEW) sağlanır. DEBUG_NEW normalde işlecini her kullandığınızda new kullanılır.

Diğer tanılamalarda olduğu gibi, CMemoryState tanılamalar yalnızca programınızın hata ayıklama sürümlerinde kullanılabilir. Hata ayıklama sürümünde _DEBUG sabiti tanımlanmış olmalıdır.

Programınızın bellek sızıntısı olduğundan şüpheleniyorsanız, program yürütmede Checkpointiki farklı noktada bellek durumu (ayrılan nesneler) arasındaki farkı bulmak için , Differenceve DumpStatistics işlevlerini kullanabilirsiniz. Bu bilgiler, bir işlevin ayırdığı tüm nesneleri temizleyip temizlemediğini belirlemede yararlı olabilir.

Yalnızca ayırma ve serbest bırakmadaki dengesizlik yerini bilmek yeterli bilgi sağlamıyorsa, işlevini kullanarak önceki çağrısından DumpAllObjectsSince bu yana ayrılan tüm nesnelerin dökümünü Checkpointalabilirsiniz. Bu döküm ayırma sırasını, nesnenin ayrıldığı kaynak dosyayı ve satırı (ayırma için DEBUG_NEW kullanıyorsanız) ve nesnenin türetmesini, adresini ve boyutunu gösterir. DumpAllObjectsSince ayrıca geçerli durumu hakkında bilgi sağlamak için her nesnenin Dump işlevini çağırır.

Nasıl kullanılacağı CMemoryState ve diğer tanılamalar hakkında daha fazla bilgi için bkz . MFC Uygulamalarında Hata Ayıklama.

Not

Türündeki CMemoryState nesnelerin bildirimleri ve üye işlevlerine yapılan çağrılar yönergelere göre #if defined(_DEBUG)/#endif köşeli ayraç içine alınmalıdır. Bu, bellek tanılamalarının yalnızca programınızın hata ayıklama derlemelerine dahil edilmesine neden olur.

Devralma Hiyerarşisi

CMemoryState

Gereksinimler

Üst bilgi: afx.h

CMemoryState::Checkpoint

Belleğin anlık görüntüsünü alır ve bu CMemoryState nesnede depolar.

void Checkpoint();

Açıklamalar

Üye CMemoryState işlevleri Difference ve DumpAllObjectsSince bu anlık görüntü verilerini kullanır.

Örnek

CMemoryState oluşturucusunun örneğine bakın.

CMemoryState::CMemoryState

Denetim Noktası veya Fark üye işlevi tarafından doldurulması gereken boş CMemoryState bir nesne oluşturur.

CMemoryState();

Örnek

CMemoryState msOld;
msOld.Checkpoint();
CPerson* pper1 = new CPerson();
CPerson* pper2 = new CPerson();
msOld.DumpAllObjectsSince();

CMemoryState::D ifference

İki CMemoryState nesneyi karşılaştırır, sonra farkı bu CMemoryState nesnede depolar.

BOOL Difference(
    const CMemoryState& oldState,
    const CMemoryState& newState);

Parametreler

oldState
Denetim noktası tarafından CMemoryState tanımlanan ilk bellek durumu.

newState
Denetim noktası tarafından CMemoryState tanımlanan yeni bellek durumu.

Dönüş Değeri

İki bellek durumu farklıysa sıfır olmayan; aksi takdirde 0.

Açıklamalar

İki bellek durumu parametresinin her biri için denetim noktası çağrılmalıdır.

Örnek

CMemoryState oluşturucusunun örneğine bakın.

CMemoryState::D umpAllObjectsSince

Dump Bu CMemoryState nesne için son Denetim Noktası çağrısından bu yana ayrılmış (ve hala ayrılmış) sınıfından CObject türetilmiş bir türün tüm nesneleri için işlevini çağırır.

void DumpAllObjectsSince() const;

Açıklamalar

Başlatılmamış bir nesneyle çağrılması DumpAllObjectsSince CMemoryState , şu anda bellekte olan tüm nesnelerin dökümünü alır.

Örnek

CMemoryState oluşturucusunun örneğine bakın.

CMemoryState::D umpStatistics

Fark üye işlevi tarafından doldurulan bir nesneden kısa bir CMemoryState bellek istatistikleri raporu yazdırır.

void DumpStatistics() const;

Açıklamalar

afxDump cihazına yazdırılan raporda aşağıdakiler gösterilir:

Örnek rapor, aşağıdakilerin sayısı (veya miktarı) hakkında bilgi verir:

  • ücretsiz bloklar

  • normal bloklar

  • CRT blokları

  • blokları yoksay

  • istemci blokları

  • program tarafından herhangi bir zamanda kullanılan en fazla bellek (bayt cinsinden)

  • program tarafından şu anda kullanılan toplam bellek (bayt cinsinden)

Serbest bloklar, olarak ayarlandıysa afxMemDF delayFreeMemDFserbest bırakması geciken blok sayısıdır. Daha fazla bilgi için "MFC Makroları ve GenelLeri" bölümündeki afxMemDF bölümüne bakın.

Örnek

Aşağıdaki kod projnameApp.cpp yerleştirilmelidir. Aşağıdaki genel değişkenleri tanımlayın:

static CMemoryState oldstate, newstate, diffstate;

işlevine InitInstance şu satırı ekleyin:

oldstate.Checkpoint();

İşlev için ExitInstance bir işleyici ekleyin ve aşağıdaki kodu kullanın:

newstate.Checkpoint();
if (diffstate.Difference(oldstate, newstate))
{
   TRACE(_T("Memory leaked\n"));
   diffstate.DumpStatistics();
}

Artık işlevin çıkışını DumpStatistics görmek için programı Hata Ayıklama modunda çalıştırabilirsiniz.

Ayrıca bkz.

Hiyerarşi Grafiği