Bonjour,
Je suis en train de programmer un jeu vidéo de stratégie, et actuellement le dev est en pause à cause d'un crash dur à corriger.
plateforme
- Visual Studio 2008
- Windows XP
Dans la boucle du jeu, les unités sont mises à jour; certaines peuvent etre 'tuées', et s'ajoutent alors à une liste de pointeurs contenant, toutes les unités à supprimer. Cette suppression est effectuée juste après la mise à jour des unités.
Le problème, c'est que ca crashe. Le crash n'est pas systématique, arrive en général après 1 ou 2 suppression(s); j'ai utilisé le débuggueur de VC++. Arrivé sur la ligne 'delete entt', segfault immédiate: les destructeurs ne sont même pas appelés, j'ai l'impression que c'est l'adresse même de l'opérateur delete qui est mauvaise... De temps en temps l'unité est déjà supprimée avant le delete (je ne sait pas pourquoi, y pas beaucoup de delete dans mon code surtout au niveau des unités), mais la plupart du temps l'unité à supprimer est bien présente en mémoire, sans aucun problème, je peut y accéder avec visual studio par exemple.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 // update entities for(int t = 0; t < 8; t++) if(entities[t]) entities[t]->updateEntity(deltaT); // search for deleted entities while(deletionQueue.begin() != deletionQueue.end()) { game::Entity* entt = *deletionQueue.begin(); if(entt) { printf("deleting 0x%p...",entt); delete entt; for(int t = 0; t < 8; t++) if(entities[t] == entt) entities[t] = 0; if(selectedEntity == entt) selectedEntity=0; } deletionQueue.erase(deletionQueue.begin()); }
En bref, je sais juste que c'est le delete qui plante, mais pas pourquoi
Merci d'avance pour votre aide,
~Darktib
edit: j'ai essayé avec gcc... il n'y a pas de crash, par contre y des tas de petits bugs partout...et qui n'apparaissent qu'avec ce compilo
edit2: en réessayant (sans avoir recompilé), je suis tombé sur une autre erreur (mais pour le même crash..), au lieu d'une violation d'accès mémoire, windows m'a balancé une "Privileged Instruction", et avec du googling j'ai vu que ca viendrait d'une corruption de la pile... à confirmer, je recherche un peu plus.
Partager