2010-12-07 13 views
1

Ich habe eine Codezeile, die mein Programm im Release-Modus abstürzt, aber nicht im Debug-Modus ...Pointer Vergleich Absturz mein Programm

if((DWORD)pPrev < (DWORD)pBlock && pPrev->pList == &gFreeList) 

ich die Adressen der Zeiger zu vergleichen, um DWORD gegossen. .. In diesem if-Block wird der vorherige Knoten den aktuellen Knoten akkumulieren, aber nur, wenn seine physikalische Adresse niedriger als der aktuelle Block ist und er bereits frei ist ... Der Blockcode ist nicht das Problem. Es wird nicht einmal den Block betreten. Es stürzt beim Vergleich der Zeiger ab.

Der Code funktioniert perfekt im Debug-Modus, so dass ich ihn im Debug-Modus nicht zum Absturz oder sogar Fehlfunktion bringen kann, um zu sehen, was vor sich geht ... Ich sehe nicht, was damit nicht stimmt. Irgendwelche Ideen?

Wenn es hilft, ich bin mit VC6 für die Entwicklung von Prototypen (einfach, weil der IDE ist weniger ressourcenintensiv) ...

Dank

+0

Sie wissen, VC6 ist berüchtigt für unglaublich buggy. – Puppy

Antwort

0

Kann pPrev nicht initialisiert werden?

Wenn ja, die Voraussetzung, (DWORD)pPrev < (DWORD)pBlock kann nicht im Debug-Modus halten, weil pPrev unitialized wird auf 0xCCCCCCCC (oder CD?), Das wird sicherlich größer als jeder auf DWORD gegossenen Zeiger (2, höchstens 3GBs in 32-Bit-Modus -> Maximale Benutzerraumadresse 0xBFFFFFFF).

In Release-Modus würde es jedoch Müll enthalten, so dass es in (DWORD)pPrev < (DWORD)pBlock dereferenziert werden könnte und das Programm abstürzen.

0

Vergleich sollte keine Probleme hier verursachen. In der Tat, ich denke, der Vergleich würde auch ohne die Umwandlungen zu DWORD funktionieren. Ich vermute, dass pPrev-> pList das Problem verursacht. Sind Sie sicher, dass pPrev vor der Dereferenzierung nicht versehentlich geleert wurde?

+0

Ich werde es noch einmal durchgehen, um zu sehen, aber pPrev wurde nicht einmal vor diesem Punkt referenziert ... und im Debug-Modus, kurz bevor es im Freigabemodus abstürzen würde, ist der pPrev Zeiger in Ordnung ... Ich wünschte nur ich könnte es im Debug-Modus zum Absturz bringen. – oldSkool

+0

Es läuft gut, wenn mit VS2008 in Release-Modus kompiliert ... Ich gebe auf VC6. Das einzige, was ich mir vorstellen kann, ist eine Art von Optimierungsfehler – oldSkool

+0

Haben Sie versucht, alle beteiligten Variablen, z. Verwenden Sie printf(), kurz vor der problematischen Zeile, während Sie im Release-Modus laufen? –