La solution de @Carlos est parfaite pour les petits problèmes. Mais pour les gros problèmes, le ralentissement qui en résulte est parfois insupportable.
Dans ce cas, on peut placer
ASSERT(_CrtCheckMemory());
quelque part dans le code, où l'on soupçonne que le problème est déjà présent. Cette commande vérifie le tas à (et seulement à) l'endroit où il est inséré, et non après chaque new
ou delete
appeler comme dans le cas de _CRTDBG_CHECK_ALWAYS_DF
. Cela maintient le temps d'exécution raisonnable, par rapport à l'option _CRTDBG_CHECK_ALWAYS_DF
.
On peut trouver assez rapidement la ligne de code problématique en utilisant une approche de type recherche binaire pour placer les assertions.
Cependant, parfois _CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF)
et/ou _CrtCheckMemory()
ne sont pas en mesure de détecter les problèmes. Puis en utilisant gflags
est une autre possibilité, qui est capable de montrer où la corruption de tas se produit. En un mot :
- activer le segment de page (généralement, vous auriez besoin des privilèges d'administrateur ), par exemple :
il y aura un rapport, ce tas vérifie"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
ont été activés. - exécuter le programme dans le débogueur. Les accès hors limites, qui corrompraient le tas, conduisent maintenant à une violation d'accès et sont facilement visibles dans le débogueur.
- désactiver le segment de page une fois le débogage terminé, par exemple :
"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe" /p /disable <full_path_to_exe_to_debug.exe>
- les programmes avec vérification de tas activée peuvent être listés via
"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe" /p
Utilisez le tas de débogage et appelez-le au tout début dans main().
_CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF);
Cela ralentira beaucoup le programme, mais il devrait s'arrêter dès que la corruption se produira.
Reportez-vous à cet article pour plus de détails :https://msdn.microsoft.com/en-us/library/974tc9t1.aspx#BKMK_Check_for_heap_integrity_and_memory_leaks