Solusi @Carlos sangat cocok untuk masalah yang lebih kecil. Namun untuk masalah besar, pelambatan yang dihasilkan terkadang merupakan sesuatu yang tidak dapat Anda terima.
Dalam hal ini, seseorang dapat menempatkan
ASSERT(_CrtCheckMemory());
di suatu tempat dalam kode, di mana orang menduga masalah sudah ada. Perintah ini memeriksa heap di (dan hanya di) tempat yang disisipkan, dan tidak setelah setiap new
atau delete
panggilan seperti dalam kasus _CRTDBG_CHECK_ALWAYS_DF
. Ini menjaga waktu eksekusi tetap masuk akal, dibandingkan dengan opsi _CRTDBG_CHECK_ALWAYS_DF
.
Seseorang dapat menemukan baris kode yang bermasalah dengan cukup cepat menggunakan pendekatan pencarian biner untuk menempatkan penegasan.
Namun, terkadang _CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF)
dan/atau _CrtCheckMemory()
tidak dapat mendeteksi masalah. Kemudian gunakan gflags
adalah kemungkinan lain, yang mampu menunjukkan di mana tumpukan-korupsi terjadi. Singkatnya:
- aktifkan heap halaman (biasanya Anda memerlukan hak istimewa admin ), mis.:
akan ada laporan, bahwa heap memeriksa"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe" /p /enable <full_path_to_exe_to_debug.exe> /full
exe_to_debug.exe
telah diaktifkan. - jalankan program di debugger. Mengakses di luar batas, yang akan merusak heap sekarang menyebabkan pelanggaran akses dan mudah dilihat di debugger.
- nonaktifkan heap halaman setelah proses debug selesai, mis.:
"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe" /p /disable <full_path_to_exe_to_debug.exe>
- program dengan pemeriksaan heap yang diaktifkan dapat dicantumkan melalui
"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe" /p
Gunakan heap debug dan panggil ini di awal main().
_CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF);
Ini akan sangat memperlambat program tetapi harus segera berhenti setelah korupsi terjadi.
Lihat artikel ini untuk detailnya:https://msdn.microsoft.com/en-us/library/974tc9t1.aspx#BKMK_Check_for_heap_integrity_and_memory_leaks