[C++] Problème de segmentation - std::stack
Forum Programmation : [C++] Problème de segmentation - std::stack
Bonjour à tous !
J'expérimente une nouvelle façon de gérer mes événements en SDL. Je voulais utiliser la pile (ou <i>stack</i> ), mais j'ai des petits problèmes de violation d'accès (ou de segmentation).
Voici mon code :
Code :
|
Voilà. Le problème vient de là : si je met cette partie en commentaire, ça marche (mise à part quelques petits problèmes après dans le programme).
Merci beaucoup à tous mes sauveurs !
Et si tu commentes juste les push() ?
Eh bien, comme il fallait s'y attendre, tout fonctionne bien... D'où est-ce que ça peut venir ? Pourtant, le StateStack est bien déclaré, non ?
Je crois me souvenir qu'en C++ les "struct" sont en fait des "class".
quand tu fais la pile, le constructeur par recopie est appelé pour copier l'objet, peut-être qu'il y a un problème de ce côté.
Tu devrais essayer de gérer des pointeurs pour éviter de faire des copies:
Code :
|
mais attention à zone de définition des variables
Ca a l'air de marcher là. Merci de ton aide. Enfin... Ca marche... Je n'ai plus de problème de mémoire. Mais à présent, c'est comme si mes fonctions n'étaient pas utilisées... Je vais regarder !
Il faut voir que c'est un pointeur que tu passes, il faut donc gérer toi-même la mémoire de tous les objets (création par des new et destruction par des delete) si tu comptes faire sortir un objet de ta fonction.
Comment cela ?
Quelques détails supplémentaires : en fait je me sers des quelques lignes précédentes pour indiquer quel est l'état. J'ai pour ce faire trois fonctions : Exit(), Game() et Menu() qui gèrent toutes trois des parties différentes du jeu.
Je me sers du pointeur StatePointer pour simplement renvoyer la fonction à utiliser par l'intermédiaire de :
Code :
|
Voilà l'ossature de mon programme ! Mais je ne pense pas qu'il faille créer quoi que ce soit, vu que la variable StateStack est créee en globale...
Statestack est effectivement créé en globla, mais il faut aussi que les objets mis dedans le soient, car si tu crée state1 en local sans utiliser new dans ta fonction Init(), il sera détruit à la sortie de la fonction, et au final, tu auras dans ta pile un pointeur qui pointera dans une zone mémoire non aloué et où il n'y a rien => résultat crash de l'application quand tu va appeler un élément de la pile.
Donc il te faut faire des new pour tout objets mis dans la pile. Et du coup faire des delete avant la suppression de la pile (car sinon tu supprime la pile sans supprimer les objets contenus).
Effectivement ! Ca marche beaucoup mieux maintenant ! Au moins, ça a des points positifs : j'ai jamais autant vu de cours sur les pointeurs et sur les std::stack en si peu de temps !
Eh bien, merci beaucoup ! Je peux enfin tenter de terminer mon programme, avant le prochain problème !
Il y a 1930 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Par allstar27 il y a 4 jours :