IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Segfault bizarre avec delete


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Darktib
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 66
    Par défaut Segfault bizarre avec delete
    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.
    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());
    		}
    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.

    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.

  2. #2
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 545
    Par défaut
    Bonjour,

    Citation Envoyé par Darktib Voir le message
    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
    des petits bugs, vous voulez dire des messages d'erreur/warning ? donnez des exemples

    si vous arrivez néanmoins à compiler la chose avec g++ sous Linux je vous conseille de regarder ce qui se passe en lançant l'exécution avec valgrind
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  3. #3
    Membre éclairé Avatar de Darktib
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 66
    Par défaut
    Merci de votre réponse.

    Pour le compilo: mingw.

    Le bugs ne sont pas des bugs lors de la compilation, mais en cours d'exécution, du genre des comportements indéterminés... Le mieux serait que je puisse rester sous visual studio.

    Sinon, j'ai regardé au niveau assembleur et j'ai vu qu'à un moment, delete appelle le destructeur (il fait un call edx) - mais ce après deux trois opérations. Et il se trouve que assez souvent, le registre edx à l'air de contenir n'importe quoi; du coup le destructeur n'est pas appelé, et le code saute n'importe ou... pour me donner une belle privilegied instruction. Sans doute une corruption de la pile, ou de l'objet ? Et si c'est le cas, comment voir où arrive cette corruption ?

    J'ai aussi essayé PageHeap; cependant, ca n'a rien donné...

  4. #4
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 545
    Par défaut
    ce qui est certain c'est que vous avez du jardinage mémoire, et cela à beau être le printemps c'est pas bien

    si vous ne pouvez vraiment pas compiler/exécuter la chose sous Linux via valgrind peut être pouvez-vous modifier votre code en remplaçant tous vos delete de game::Entity par un ajout dans une liste, et à chaque fois vous regardez si par hasard vous n'avez pas déjà détruit la chose ? Évidemment cela ne marche que pour les deletes explicites, et votre problème de corruption mémoire vient peut être d'ailleurs
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  5. #5
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Pourquoi se bouffer des pointeur et delete par dizaines ? RAII en force !!!!
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  6. #6
    Membre éclairé Avatar de Darktib
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 66
    Par défaut
    @bruno_pages : j'ai effectué ce que vous dites. Il se trouve qu'il n'y a que deux delete qui détruisent des entités dans tout le code pour l'instant.
    Et aucune entité n'est supprimée deux fois...

    @davidbrcz : Où appliquer du RAII ici ? Les entités doivent pouvoir etre créees/détruites à la volée, etc...


    Sinon, comment voir si un objet à été corrompu ?

    edit: précision, j'utilise Irrlicht et Boost, mais je ne pense pas que ca influe tant que ca.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur avec DELETE !
    Par James64 dans le forum Langage SQL
    Réponses: 18
    Dernier message: 25/10/2005, 10h49
  2. Problème très bizarre avec COUNT
    Par Nomade95000 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/10/2005, 14h12
  3. [SWING] Exception bizarre avec Thread
    Par Gob4 dans le forum Débuter
    Réponses: 2
    Dernier message: 13/09/2005, 21h55
  4. [C#] Truc bizarre avec DataSet
    Par bendj dans le forum ASP.NET
    Réponses: 15
    Dernier message: 13/07/2005, 19h51
  5. problèmes bizarres avec jdbc
    Par jaimepasteevy dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 12/12/2003, 12h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo