Struktur CMemoryState
Menyediakan cara mudah untuk mendeteksi kebocoran memori dalam program Anda.
Sintaks
struct CMemoryState
Anggota
Konstruktor Publik
Nama | Deskripsi |
---|---|
CMemoryState::CMemoryState | Membangun struktur seperti kelas yang mengontrol titik pemeriksaan memori. |
Metode Publik
Nama | Deskripsi |
---|---|
CMemoryState::Checkpoint | Mendapatkan rekam jepret (titik pemeriksaan) dari status memori saat ini. |
CMemoryState::D ifference | Menghitung perbedaan antara dua objek jenis CMemoryState . |
CMemoryState::D umpAllObjectsSince | Mencadangkan ringkasan semua objek yang saat ini dialokasikan sejak titik pemeriksaan sebelumnya. |
CMemoryState::D umpStatistics | Mencetak statistik alokasi memori untuk objek CMemoryState . |
Keterangan
CMemoryState
adalah struktur dan tidak memiliki kelas dasar.
"Kebocoran memori" terjadi ketika memori untuk objek dialokasikan pada timbunan tetapi tidak dibatalkan alokasinya ketika tidak lagi diperlukan. Kebocoran memori tersebut akhirnya dapat menyebabkan kesalahan di luar memori. Ada beberapa cara untuk mengalokasikan dan membatalkan alokasi memori dalam program Anda:
malloc
/free
Menggunakan keluarga fungsi dari pustaka run-time.Menggunakan fungsi manajemen memori Windows API,
LocalAlloc
/LocalFree
dan .GlobalAlloc
/GlobalFree
Menggunakan C++
new
dandelete
operator.
CMemoryState
Diagnostik hanya membantu mendeteksi kebocoran memori yang disebabkan ketika memori yang dialokasikan menggunakan new
operator tidak dibatalkan alokasinya menggunakan delete
. Dua grup fungsi manajemen memori lainnya adalah untuk program non-C++, dan mencampurnya dengan new
dan delete
dalam program yang sama tidak disarankan. Makro tambahan, DEBUG_NEW, disediakan untuk menggantikan new
operator saat Anda memerlukan pelacakan file dan nomor baris alokasi memori. DEBUG_NEW digunakan setiap kali Anda biasanya menggunakan new
operator.
Seperti halnya diagnostik lainnya, CMemoryState
diagnostik hanya tersedia dalam versi debug program Anda. Versi debug harus memiliki konstanta _DEBUG yang ditentukan.
Jika Anda menduga program Anda memiliki kebocoran memori, Anda dapat menggunakan Checkpoint
fungsi , Difference
, dan DumpStatistics
untuk menemukan perbedaan antara status memori (objek yang dialokasikan) pada dua titik berbeda dalam eksekusi program. Informasi ini dapat berguna dalam menentukan apakah fungsi membersihkan semua objek yang dialokasikannya.
Jika hanya mengetahui di mana ketidakseimbangan dalam alokasi dan alokasi terjadi tidak memberikan informasi yang cukup, Anda dapat menggunakan DumpAllObjectsSince
fungsi untuk mencadangkan semua objek yang dialokasikan sejak panggilan sebelumnya ke Checkpoint
. Cadangan ini menunjukkan urutan alokasi, file sumber, dan baris tempat objek dialokasikan (jika Anda menggunakan DEBUG_NEW untuk alokasi), dan derivasi objek, alamatnya, dan ukurannya. DumpAllObjectsSince
juga memanggil fungsi setiap objek Dump
untuk memberikan informasi tentang statusnya saat ini.
Untuk informasi selengkapnya tentang cara menggunakan CMemoryState
dan diagnostik lainnya, lihat Men-debug Aplikasi MFC.
Catatan
Deklarasi objek jenis CMemoryState
dan panggilan ke fungsi anggota harus dikurung oleh #if defined(_DEBUG)/#endif
arahan. Hal ini menyebabkan diagnostik memori hanya disertakan dalam build debugging program Anda.
Hierarki Warisan
CMemoryState
Persyaratan
Header: afx.h
CMemoryState::Checkpoint
Mengambil ringkasan rekam jepret memori dan menyimpannya di objek ini CMemoryState
.
void Checkpoint();
Keterangan
Anggota CMemoryState
memfungsikan Perbedaan dan DumpAllObjectsSince menggunakan data rekam jepret ini.
Contoh
Lihat contoh untuk konstruktor CMemoryState .
CMemoryState::CMemoryState
Membuat objek kosong CMemoryState
yang harus diisi oleh fungsi anggota Titik Pemeriksaan atau Perbedaan .
CMemoryState();
Contoh
CMemoryState msOld;
msOld.Checkpoint();
CPerson* pper1 = new CPerson();
CPerson* pper2 = new CPerson();
msOld.DumpAllObjectsSince();
CMemoryState::D ifference
Membandingkan dua CMemoryState
objek, lalu menyimpan perbedaan ke dalam objek ini CMemoryState
.
BOOL Difference(
const CMemoryState& oldState,
const CMemoryState& newState);
Parameter
oldState
Status memori awal seperti yang CMemoryState
didefinisikan oleh titik pemeriksaan.
newState
Status memori baru seperti yang CMemoryState
didefinisikan oleh titik pemeriksaan.
Tampilkan Nilai
Bukan nol jika dua status memori berbeda; jika tidak, 0.
Keterangan
Titik pemeriksaan harus dipanggil untuk masing-masing dari dua parameter status memori.
Contoh
Lihat contoh untuk konstruktor CMemoryState .
CMemoryState::D umpAllObjectsSince
Dump
Memanggil fungsi untuk semua objek jenis yang berasal dari kelas CObject
yang dialokasikan (dan masih dialokasikan) sejak panggilan Titik Pemeriksaan terakhir untuk objek iniCMemoryState
.
void DumpAllObjectsSince() const;
Keterangan
Memanggil DumpAllObjectsSince
dengan objek yang tidak diinisialisasi CMemoryState
akan membuang semua objek yang saat ini dalam memori.
Contoh
Lihat contoh untuk konstruktor CMemoryState .
CMemoryState::D umpStatistics
Mencetak laporan statistik memori ringkas dari CMemoryState
objek yang diisi oleh fungsi Anggota perbedaan .
void DumpStatistics() const;
Keterangan
Laporan, yang dicetak pada perangkat afxDump , menunjukkan hal berikut:
Laporan sampel memberikan informasi tentang angka (atau jumlah) dari:
blok bebas
blok normal
Blok CRT
abaikan blok
blok klien
memori maksimum yang digunakan oleh program kapan saja (dalam byte)
total memori yang saat ini digunakan oleh program (dalam byte)
Blok gratis adalah jumlah blok yang pembatalan alokasinya tertunda jika afxMemDF
diatur ke delayFreeMemDF
. Untuk informasi selengkapnya, lihat afxMemDF, di bagian "Makro MFC dan Global".
Contoh
Kode berikut harus ditempatkan dalam projnameApp.cpp. Tentukan variabel global berikut:
static CMemoryState oldstate, newstate, diffstate;
InitInstance
Dalam fungsi , tambahkan baris :
oldstate.Checkpoint();
Tambahkan handler untuk ExitInstance
fungsi dan gunakan kode berikut:
newstate.Checkpoint();
if (diffstate.Difference(oldstate, newstate))
{
TRACE(_T("Memory leaked\n"));
diffstate.DumpStatistics();
}
Anda sekarang dapat menjalankan program dalam mode Debug untuk melihat output DumpStatistics
fungsi.