2012-11-01 5 views
5

Ich versuche zu verstehen, wie _CrtCheckMemory zu Heap-Beschädigung in einer Windows-Anwendung, die ich arbeite, zu verfolgen. Ich kann es nicht scheinen, um es zurückzugeben false. Hier ist mein Testcode:_CrtCheckMemory Verwendungsbeispiel

int* test = new int[1]; 
for(int i = 0; i < 100; i++){ 
    test[i] = 1; 
} 
assert(_CrtCheckMemory()); 

In dem obigen Code, _CrtCheckMemory() gibt true zurück. Ich laufe im Debug-Modus. Was muss ich noch tun, um ein einfaches Beispiel für _CrtCheckMemory ein Problem zu melden?

Antwort

6

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.

+0

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

+0

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 –

+0

Danke. Richten Sie ein neues, todscharfes Projekt ein, nur damit ich dieses _CrtCheckMemory tatsächlich sehen kann. – morgancodes