Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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/LocalFreeveGlobalAlloc/GlobalFreekullanma.C++
newvedeleteiş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.