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 :

Plantage dans mon application : recherche d'hypothèses sur l'origine...


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : septembre 2002
    Messages : 200
    Points : 120
    Points
    120
    Par défaut Plantage dans mon application : recherche d'hypothèses sur l'origine...
    Bonjour à tous,
    j'ai fait un programme qui n'arrête pas de planter, mais je ne vois jamais vraiment ou dans la pile d'appel (en plus il est multithreadé). Pour l'instant je ne me base que sur des hypothèses. Voici donc la première.

    J'ai un tableau dynamique à 2d rempli de pointeurs d'objets. En voici la définition:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector< std::vector< TSquare* > >		m_o_squares ;
    J'ajoute des éléments dans une boucle, en créant un tableau à 1d temporaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    for ( unsigned char loc_uc_i = 0 ; loc_uc_i < N; loc_uc_i++ )
    {
          std::vector< TSquare* > loc_o_vert_squares ;
     
          loc_o_vert_squares.push_back( new TSquare(1));
          loc_o_vert_squares.push_back( new TSquare(2));
          loc_o_vert_squares.push_back( new TSquare(3)); etc...
     
          // Et ici ma question :
         m_o_squares.push_back( loc_o_vert_squares );
    }
    Voilà donc ma question est :
    quand on fait un push_back d'un vecteur entier dans un autre vecteur (donc dans la deuxieme dimension de mon tableau en fait), est-ce que ca recopie intégralement tout le vecteur ? (ca semble etre fait quand je regarde le contenu de m_o_square[0], je retrouve bien mes squares 1, 2, 3...)

    Est-ce que ca ne créé pas d'indirection ? (je veux dire, vu que loc_o_vert_squares est une variable locale et qu'elle est détruite en dehors du bloc ??).

    Bref est-ce que mon jardinage pourrait venir de là ?

    Merci

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2008
    Messages : 7 634
    Points : 13 008
    Points
    13 008
    Par défaut
    Salut,
    Le destructeur de std::vector ne fait pas de delete sur les pointeurs qu'il contient. Donc, ce n'est pas l'utilisation d'une variable locale avant de l'injecter dans le vecteur qui est à l'origine du problème. En revanche, tu peux avoir des problèmes selon la gestion de tes pointeurs. Pourquoi ne pas utiliser des pointeurs intelligents ?

  3. #3
    Membre régulier
    Inscrit en
    septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : septembre 2002
    Messages : 200
    Points : 120
    Points
    120
    Par défaut
    Merci pour ta réponse, je vais continuer a chercher ailleurs.
    Pour l'histoire des smart pointers, pour l'instant j'en ai pas mis, mais je cherche à faire très simple avec mes allocations. Mes objets alloués et mis dans ce vecteur ne sont désalloués qu'a la fermeture du programme, par conséquent aucun risquent qu'ils fassent planter.

    En fait mon plantage est bizarre: attaché en debug, mon programme s'arrete dans le thread principale avec un SIGABRT.... ca veut dire quoi ? Ca veut dire qu'on l'a obligé à s'arrêter à cause d'une exception qui pète dans un autre thread ?

    J'ai essayer pour voir de basculer un traitement provoquant une erreur SIGABRT directement dans le thread principal: je n'ai donc plus qu'un seul thread, et ca pète quand meme.....

    Bref je sais pas.... je vais continuer à chercher, et qu'en pensez vous pour le SIGABRT ??

    Merci.

  4. #4
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2008
    Messages : 1 505
    Points : 2 795
    Points
    2 795
    Par défaut
    SIGABRT, ça veut dire que le système te jette parce que tu as fait quelque chose de mal .

    Quelques questions :
    - tes threads accèdent-ils simultanément à ton vecteur ?
    - si oui, le modifient-ils ?

    Et sinon, compile avec les infos de debug et lance sous gdb pour avoir la pile d'appels, ça doit marcher même en multithread.

  5. #5
    Membre régulier
    Inscrit en
    septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : septembre 2002
    Messages : 200
    Points : 120
    Points
    120
    Par défaut
    Merci pour ton aide.

    La pile d'appel n'est pas terrible, je ne parviens pas a voir ou ca plante (mon plantage survient tout en haut de la pile d'appel graphique, euh, j'essaie de poster un exemple plus concret ce soir, désolé.

    La réponse est non: je n'accède pas à mon vecteur dans deux threads différents, d'ailleurs j'arrive a reproduire le plantage dans un meme thread, c'est a dire dans le thread principal, sans plus jamais lancer 2 threads...

    Il doit bien y avoir un problème. Ca fait quelques mois que je suis la dessus (plus ou moins) et toujours aucun indice ne s'offre à moi !

    Le probleme aussi c'est que mon code est plutot gros, et les plantages assez alléatoires, alors je vais avoir du mal a vous fournir une pièce de code....

    Je vais pourtant essayer.
    Merci pour l'aide.

Discussions similaires

  1. Executer programme dans mon application
    Par Conker dans le forum C++Builder
    Réponses: 1
    Dernier message: 13/07/2006, 03h16
  2. [C#] Menu contextuel explorer dans mon application
    Par mikyfpc dans le forum Windows Forms
    Réponses: 5
    Dernier message: 08/11/2005, 13h45
  3. je veus plusieur Fiche MDI dans mon application
    Par HASSANAIT dans le forum Langage
    Réponses: 18
    Dernier message: 03/11/2005, 11h51
  4. importation d'un fonction d'une dll dans mon application
    Par jeannot27 dans le forum C++Builder
    Réponses: 7
    Dernier message: 11/07/2005, 15h35
  5. Réponses: 7
    Dernier message: 26/06/2003, 09h11

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