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

SL & STL C++ Discussion :

Héritage et seg fault


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Par défaut Héritage et seg fault
    Bonjour,
    pour un projet d'université on nous a demandé de créer plusieurs classes qui héritent de conteneurs de la STL. Mais j'ai lu ensuite ici que ce n'était pas une bonne idée et qu'il valait mieux passer par une composition, sauf que tout mon code est déjà fait.

    Le problème c'est que je me retrouve avec des erreurs franchement incompréhensibles alors que jusqu'ici tout fonctionnait bien. Pour résumer j'ai ces classes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    class Route : public std::list<int>
    class Solution : public std::vector<Route>
    Et j'ai des segmentation fault parfois dans une fonction toute simple parcourant la liste (dans Route), parfois dans les destructeurs de List et à l'instant même sur une simple affectation de valeur dans un int un peu plus loin (je suppose que gdb s'est embrouillé sur ce coup là).
    Je précise que ça ne plante dés le début, ça boucle sur plusieurs fichiers et les premiers fonctionnent tout à fait. Je n'ai pas réussi à voir la différence de contexte.

    Est-ce que quelqu'un aurait une piste de ce qui peut se passer ? est-ce que définitivement ces héritages sont imprévisibles et que je dois tout modifier pour une composition ?

    Merci d'avance.

  2. #2
    Membre éprouvé
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Par défaut
    Bon finalement l'erreur venait de moi, je supprimais un objet dans un certain cas alors que je n'aurais pas dû. Du coup je suppose qu'ensuite un delete était appelé sur un pointeur déjà libéré, même si je trouve toujours étrange les erreurs que cela provoquait.

  3. #3
    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
    Par défaut
    Salut,
    Une classe devant servir de base à une héritage devrait avoir un destructeur virtuel s'il est public ou protégé s'il n'est pas virtuel comme l'explique cette entrée de la F.A.Q : Pourquoi le destructeur d'une classe de base doit être public et virtuel ou protégé et non virtuel ?
    Le corolaire est que si une classe a un destructeur public non virtuel, alors elle ne doit pas être utilisée pour un héritage public. Ce qui est le cas des conteneurs de la STL.
    La composition est alors souvent la solution employée pour utiliser les services de la classe.
    Néanmoins, si ton projet impose l'utilisation de l'héritage, alors tu peux quand même t'en sortir 'proprement' avec une héritage privé. L'héritage privé permet de bénéficier de l'implémentation de la classe de base sans rajouter la sémantique EST-UN. Tu peux ensuite ramener les fonctions qui t'intéressent de la classe de base vers une visibilité publique dans la classe dérivée avec le mot-clé using :
    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
    23
    24
    25
    26
    27
    28
    #include <list>
     
    class Route : private std::list<int>
    {
       public:
       using std::list<int>::begin;
       using std::list<int>::end;
       using std::list<int>::push_back;
     
    };
     
    #include <iostream>
    #include <iterator>
    #include <algorithm>
    int main()
    {
       Route r;
       r.push_back(1);
       r.push_back(2);
       r.push_back(3);
       std::cout<<"Mes routes : \n";
       std::copy(
          r.begin(),
          r.end(),
          std::ostream_iterator<int>(std::cout,"\n")
       );
       return 0;
    }
    Ainsi, il n'est plus possible d'écrire le code suivant qui est un comportement indéfini sinon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       std::list<int> *p = new Route; // erreur : cast impossible
       delete p;

  4. #4
    Membre éprouvé
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Par défaut
    Je ne connaissais pas using, merci beaucoup de cette réponse claire

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

Discussions similaires

  1. Programme qui plante : seg fault
    Par Premium dans le forum C
    Réponses: 10
    Dernier message: 01/12/2006, 15h12
  2. [Seg Fault] introuvable
    Par Goundy dans le forum C
    Réponses: 13
    Dernier message: 14/04/2006, 21h00
  3. Réponses: 2
    Dernier message: 10/04/2006, 19h40
  4. [fclose] erreur de fermeture (seg fault)
    Par Goundy dans le forum C
    Réponses: 17
    Dernier message: 06/04/2006, 13h16
  5. probleme de valeur retournée et seg fault
    Par florent_de_brest dans le forum C
    Réponses: 5
    Dernier message: 04/12/2005, 16h28

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