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 CMemoryState iki 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
veGlobalAlloc
/GlobalFree
kullanma.C++
new
vedelete
işleçlerini kullanma.
Tanılama CMemoryState
yalnızca işleci kullanılarak ayrılan bellek kullanılarak delete
serbest 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 Checkpoint
iki farklı noktada bellek durumu (ayrılan nesneler) arasındaki farkı bulmak için , Difference
ve 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ü Checkpoint
alabilirsiniz. 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
delayFreeMemDF
serbest 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.