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

C++ Discussion :

Stack overflow bizarre sur un std::vector


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Points : 52
    Points
    52
    Par défaut Stack overflow bizarre sur un std::vector
    Bonjour m'sieurs, dames,

    ben voila, j'ai un tableau de pointeurs sur une classe CTransformation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      vector< CTransformation*> tableau_;
    Cet objet fait partie des attributs d'une autre classe CComposant. Je suis dans le cadre d'une simulation longue. Je teste regulierement la taille des tableaux de mes CComposant en appelant la propriété NbTransf() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int CComposant::NbTransf()
    {
    	return (int)tableau_.size();
    }
    Hé bien, ou bout d'un certain temps, en debug j'obtiens une exception de stack overflow, et en release l'appli se ferme brutalement sans sommation, ou autre message d'erreur... Le CComposant en question est bien défini. Je travaille sous visual et je peux voir la valeur de mon "tableau_" qui est bien vide "tableau|[0]()". Et pourtant ca plante à ce moment là. Ce n'est pourtant pas une partie multi-threadée, donc pas d'accés concurrent...

    Plantage à l'appel d'un "size" sur un std::vector, je n'ai jamais vu ca !
    Avez vous des idées svp ? Merci !

  2. #2
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 379
    Points
    20 379
    Par défaut
    Salut on n'a pas assez de code , comment est alloué CTransformation *, comment il est supprimé donc on ne peut pas trop répondre..

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Points : 52
    Points
    52
    Par défaut
    Le "tableau_" en question sur lequel l'appli plante n'est jamais rempli.
    Il est vider dans le constructeur du CComposant :
    de base, et plus aucun remplissage aprés !
    Il y a justement seulement des accés pour vérifier sa taille et appliquer le traitement adéquate si celle ci est non nulle. Dans le cas de celui qui plante, il est toujours vide et de nombreux accés à tableau_.size() se passent bien, jusqu'au moment ou cela plante !

  4. #4
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 255
    Points : 2 627
    Points
    2 627
    Par défaut
    Citation Envoyé par jcloupgarou Voir le message
    Dans le cas de celui qui plante, il est toujours vide et de nombreux accés à tableau_.size() se passent bien, jusqu'au moment ou cela plante !
    Tu dois avoir un écrasement mémoire quelque part.
    As-tu moyen de debugger ? :voir si le vecteur ne se fait pas écraser, par ex, par la variable membre déclarée juste avant lui.

  5. #5
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Points : 52
    Points
    52
    Par défaut
    Oui je traite le probleme en mode debug avec visual studio et je peux espionner la valeur des différentes variables et objets instanciés au moment du plantage.
    Le CComposant est bien défini : il comprend beaucoup d'attributs, vector sur des pointeurs, double, int, CString et autres pointeurs sur des classe maison.
    Dans l'ordre de declaration, c'est une serie de doubles et de int qui precede le tableau, et ils ont des valeurs tout à fait juste (dans l'espion du débuggueur) et c'est aussi le cas pour tous les attibuts du CComposant.

  6. #6
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 379
    Points
    11 379
    Billets dans le blog
    10
    Par défaut
    Es-tu dans un traitement récursif ou dans une boucle ?
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  7. #7
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Points : 52
    Points
    52
    Par défaut
    Tout à fait, c'est un traitement récursif sur un arbre de CComposant ( un attribut de CComposant est un vector<CComposant*>, l'algo se balade de pere en fils et de fils en fils) et à chaque tour de boucle, le code regarde si le "tableau_" du CComposant courant est vide ou pas.

  8. #8
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 379
    Points
    11 379
    Billets dans le blog
    10
    Par défaut
    Ta Stack Overflow vient donc certainement de là.
    Vérifie bien ta condition d'arrêt, tu dois être dans une boucle sans fin.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  9. #9
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Points : 52
    Points
    52
    Par défaut
    Bien vu !!!
    Effectivement, je fais un code de simulation en physique des particules, traitant les interactions particules/matière et c'était un cas d'un photon avec une certaine énergie qui a l'air de perturber les modèles physiques implémentés : Celui ci ne meurt jamais et le tracking de la particule s'en trouve donc infini.
    C'est vachement étonnant, pour un non connaisseur j'entends, que le plantage surgisse toujours au meme endroit dans le code, loin de la recursion sur le tir de particule. Parce qu'en fait, cela n'a rien a voir avec le fameux CComposant ou CTransformation que j'ai décrit précédement !
    Je le saurais pour la prochaine fois : stack overflow bizarre = potientiellement un probleme de pile des appels infinie !

  10. #10
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 379
    Points
    11 379
    Billets dans le blog
    10
    Par défaut
    Stack Overflow = Dépassement de pile (généralement d'appels)
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

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

Discussions similaires

  1. Retourner une référence sur un std::vector
    Par Rodrigue dans le forum C++
    Réponses: 12
    Dernier message: 13/10/2007, 16h30
  2. Cast sur un std::vector
    Par albat0r dans le forum SL & STL
    Réponses: 3
    Dernier message: 17/06/2007, 23h07
  3. tri sur std::vector<std::pair<int, float> >
    Par b4u dans le forum SL & STL
    Réponses: 15
    Dernier message: 01/10/2006, 09h19
  4. 3 précisions sur l'utilisation des "std::vector"
    Par Invité dans le forum SL & STL
    Réponses: 9
    Dernier message: 10/01/2006, 00h42
  5. std::sort() sur std::vector()
    Par tut dans le forum SL & STL
    Réponses: 20
    Dernier message: 05/01/2005, 19h15

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