2011-04-10 6 views
2

Je reçois une erreur de segmentation chaque fois que j'essaie d'accéder à une fonction virtuelle. Le code est fondamentalement comme ceci:Fonction virtuelle invoquant une erreur de segmentation

class Super { 
    public: 
    Super() { cout << "Ctor Super" << endl; } 
    virtual void test() = 0; 
    }; 

class Sub : public Super { 
    public: 
    Sub() { cout << "Ctor Sub" << endl; } 
    void test() { cout << "Test in Sub" << endl; } 
    }; 

void main() 
{ 
    Super* s = new Sub; 
    s->test(); // Segmentation fault So I tried the one below 

    Sub* s1 = new Sub; 
    s1->test(); //Still segmentation fault 

    Sub s2; 
    s2.test(); // Works fine BUT 

    Super *s3 = &s2; 
    s3->test(); // segmentation fault and EVEN 

    Sub *s4 = &s2; 
    s4->test(); //segmentation fault 
} 

J'ai essayé presque tout ce que je sais des fonctions virtuelles et cela ne fonctionne pas. C'est en fait une partie d'un plus gros programme donc ça pourrait avoir un problème là-bas mais dès que j'enlève la fonction virtuelle ou que j'arrête de la rendre virtuelle cela fonctionne. Des idées?

Existe-t-il un outil ou un moyen d'examiner le vtable?

+0

Le code se construit et fonctionne bien ici. –

+0

yups il devrait, mais ce n'est pas sur ma machine. Je l'utilise sur une machine PowerPC LYnxOS. Pouvez-vous penser à une situation où il ne devrait pas fonctionner. –

Répondre

0

Classe Sub n'hérite pas de la classe Super, donc ils ne sont pas liés de quelque façon que ce soit actuellement écrit.

0

Ce code peut-il compiler du tout?

  • Toutes vos méthodes sont privées.
  • Il n'y a pas d'héritage entre Sub et Super.
  • Le constructeur est nommé à tort.
  • La fonction main() ne retourne pas int.

Fixer tous ces résultats dans un code qui compile et s'exécute sans segfault.

+0

Oui, ce code compile et s'exécute .. c'est pourquoi je reçois un défaut seg. C'est un code C++, je pense que vous le confondez avec une autre langue (Java probablement ...). Quoi qu'il en soit, aidez si vous trouvez quelque chose ... des acclamations. –

+0

Le code ne ressemblait pas à ce qu'il semble maintenant quand j'ai (et Joe) répondu. Les trois premiers points ont été corrigés. Il est toujours C++ invalide car main() devrait renvoyer int (http://stackoverflow.com/questions/204476/what-should-main-return-in-c-c), mais cela ne justifierait pas un segfault. – adl

0

Je ne vois pas ce qui pourrait causer le problème, sauf un bogue de compilateur. Pouvez-vous donner la version exacte du compilateur?

En attendant, je voudrais essayer ce qui suit:

  • ajouter un membre int factice aux classes. Il se peut qu'une classe de taille nulle provoque une génération de code incorrecte.
  • déclare également Sub::test() comme virtuel. Encore une fois, le compilateur pourrait mal se comporter ici.

En outre, quel type de faute de segmentation obtenez-vous? Est-ce précisément SIGSEGV ou est-ce un autre signal? Pourriez-vous donner un backtrace de débogueur et un vidage d'assemblage local?

Questions connexes