Bagikan melalui


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 dan delete 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 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.

Lihat juga

Bagan Hierarki