Ein zusätzlicher Schritt ist erforderlich, Sie müssen den Compiler dazu verleiten, den Standardoperator new durch den Debug-Zuordner zu ersetzen. Nur der Debug-Zuordner erzeugt die Bereiche "keine-mans-Land", die einen Über- oder Unterlauf des Heap-Blocks erkennen. Es ist riskant, Code, der mit dem ursprünglichen Zuordner kompiliert wird, wird nicht gut mit Code kombiniert, der nicht war. Es zwingt Sie also, sich explizit anzumelden.
Das ist am besten in der vorkompilierten Header-Datei (stdafx.h standardmäßig) getan, so dass Sie sicher sein können, dass alle-Code den Debug-Zuordner verwendet. Wie folgt aus:
#ifdef _DEBUG
# define _CRTDBG_MAP_ALLOC
# define _CRTDBG_MAP_ALLOC_NEW
# include <crtdbg.h>
# include <assert.h>
#endif
Die CRTDBG Makros erhält die malloc() Funktionen und die neuen ersetzt Betreiber.
Achten Sie darauf, dass Ihr Code wie gepostet eine andere Diagnose zuerst auslöst. Unter Windows Vista und höher wird sich der Windows-Heap-Allokator zuerst beschweren, da der Code die Integrität des Windows-Heapspeichers zerstört hat. Machen Sie das Überschreiben etwas subtiler, indem Sie nur bis zu sagen, 2.
Hmmm. Ihre Precompiler-Dateien wurden zu stdafx.h und einem abhängigen Projekt hinzugefügt und bleiben nach dem Überschreiben meines Arrays immer noch stehen. Ich werde mir den Kopf ein bisschen kratzen. Anscheinend gibt es so etwas wie gflags, die mir auch dabei helfen können. – morgancodes
Ich habe dies getestet, bevor ich gepostet habe, mit Ihrem Code. Hat gut funktioniert. Gflags ist nützlich, wenn Sie andere Werkzeuge verwenden, wie zum Beispiel umhd.exe –
Danke. Richten Sie ein neues, todscharfes Projekt ein, nur damit ich dieses _CrtCheckMemory tatsächlich sehen kann. – morgancodes