2010-12-07 9 views
1

J'ai une ligne de code qui bloque mon programme en mode de sortie, mais pas en mode débogage ...comparaison du pointeur s'écraser mon programme

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

je rejetterai DWord pour comparer les adresses des pointeurs. .. Dans ce if-block, le noeud précédent va accumuler le noeud courant, mais seulement si son adresse physique est plus basse que le bloc courant et qu'il est déjà libre ... Le code de bloc n'est pas le problème. Il ne va même pas entrer dans le bloc. Il se bloque lors de la comparaison des pointeurs.

Le code fonctionne parfaitement en mode débogage, donc je ne peux pas le faire tomber en panne ou même dysfonctionner en mode débogage pour moi de voir ce qui se passe ... Je ne vois pas ce qui ne va pas avec ça. Des idées?

Si elle aide, je me sers VC6 pour le développement de prototypes (simplement parce que l'IDE est moins gourmand en ressources) ...

Merci

+0

Vous savez, VC6 est connu pour être incroyablement bogué. – Puppy

Répondre

0

Impossible d'initialiser pPrev?

Si oui, la condition sine qua non, (DWORD)pPrev < (DWORD)pBlock ne peut pas tenir en mode débogage, car non initialisées pPrev est réglé sur 0xCCCCCCCC (ou CD?), Ce sera sûrement plus que tout pointeur casté en DWORD (2, dans la plupart des 3GBS en mode 32 bits -> max adresse de l'espace utilisateur 0xBFFFFFFF). Cependant, en mode release, il contiendrait n'importe quelle faille, donc il pourrait être déréférencé en (DWORD)pPrev < (DWORD)pBlock et bloquer le programme.

0

Comparaison ne devrait pas être la cause de problèmes ici. En fait, je pense que la comparaison fonctionnerait même sans les conversions vers DWORD. Je suppose que c'est pPrev-> pList qui cause le problème. Etes-vous sûr que pPrev n'a pas été libéré par accident avant le déréférencement?

+0

Je reviendrai à travers pour voir, mais pPrev n'était même pas référencé avant ce point ... et en mode débogage, juste avant qu'il ne plante en mode release, le pointeur pPrev est bien ... Je souhaite juste que je pourrait l'amener à planter en mode débogage. – oldSkool

+0

Il fonctionne bien lorsqu'il est compilé avec VS2008 en mode release ... J'abandonne VC6. La seule chose à laquelle je peux penser est une sorte de bug d'optimisation – oldSkool

+0

Avez-vous essayé de tracer toutes les variables impliquées, par ex. en utilisant printf(), juste avant la ligne problématique, en cours d'exécution en mode Release? –