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 :

Problème bizarre avec un "pure virtual method called"


Sujet :

C++

  1. #1
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut Problème bizarre avec un "pure virtual method called"
    Bonjour,

    Alors, j'ai un problème assez bizarre.

    Je fais juste une mini bibliothèque pour gérer les threads pour une autre bibliothèque plus grosse. Et j'ai l'exception "pure virtual method called" qui arrive dans un cas particulier.

    Je précise tout de suite, cela ne provient pas de l'appel d'une méthode virtuelle dans un constructeur ou un destructeur. J'ai lu quelque part que ça pouvait provenir d'autres choses. J'ai vu ici : http://www.artima.com/cppsource/pure_virtual.html qu'il pouvait y avoir une autre possibilité dû à un "Dangling Pointer", mais j'avoue ne pas avoir clairement compris ce que c'était (du moins ce que j'ai compris, c'est juste quand il y a un appel sur un objet "deleté")

    Enfin, le problème, c'est que le code suivant marche parfaitement :

    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
     
    class MonThread : public Thread {
     
      public:
       void run()
       {
          //something
       }
     
    };
     
    int main(void)
    {
     MonThread t;
     t.start();
     t.join();
     return EXIT_SUCCESS;
    }
    Mais que le suivant (que je preférerais utiliser à tous les coups pour que le lancement d'exception ne fasse pas n'importe quoi) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int main(void)
    {
     MonThread t;
     t.start();
     return EXIT_SUCCESS;
    }
    ne fonctionne pas alors que le destructeur appelle join.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Thread::~Thread()
    {
      join();
      _group = 0;
      pthread_mutex_destroy(&_waitMutex);
      pthread_cond_destroy(&_waitSynchro);
    }
    Donc, est-ce que quelqu'un aurait une idée d'où pourrait provenir une telle exception (ormis les deux cas d'appel de méthode virtuelle dans un destructeur ou un constructeur) ?


    Je ne répondrai à aucune question technique en privé

  2. #2
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Et si tu nous montrais ta classe Thread? parce que là, à part ce que tu cites je ne vois pas.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  3. #3
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    J'ai commencé seulement à la faire hier, et je pense que c'est loin d'être tip top.

    Ne faites pas attention à la classe ThreadGroup.

    http://subversion.developpez.com/pro...ead/Thread.hpp
    http://subversion.developpez.com/pro...ead/Thread.cpp
    Je ne répondrai à aucune question technique en privé

  4. #4
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    L'appel virtuel en question est l'appel à run dans Millie::threadHander.

    Tu as un problème de synchronization ou de course (je n'ai pas été voir plus loin): Millie::threadHandler n'est exécuté que durant l'exécution du destructeur.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  5. #5
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Effectivement, c'était cela. L'arrivée du destructeur arrive trop vite et l'appel à run n'a pas encore eu lieu dans threadHandler.

    J'ai fait deux trois tests avec des sleep (en mettant par exemple juste un sleep avant l'appel à run), et le problème vient effectivement de là.

    Comme quoi, j'ai été mauvaise foi, le problème venait effectivement de l'appel d'une méthode virtuelle durant la destruction.

    merci
    Je ne répondrai à aucune question technique en privé

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

Discussions similaires

  1. [MySQL] Problème bizarre avec mysql_fetch_array
    Par Jango51 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 29/05/2007, 14h17
  2. [TP] Problème bizarre avec une boucle
    Par Dunk dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 10/12/2006, 14h06
  3. problème bizarre avec requete access
    Par nabil dans le forum Access
    Réponses: 9
    Dernier message: 29/05/2006, 19h28
  4. [DOM] Problème bizarre avec DOM et XPath
    Par fragmonster dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 16/03/2006, 14h43
  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