Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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/freeMenggunakan keluarga fungsi dari pustaka run-time.Menggunakan fungsi manajemen memori Windows API,
LocalAlloc/LocalFreedan .GlobalAlloc/GlobalFreeMenggunakan C++
newdandeleteoperator.
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 Checkpointfungsi , 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.