Héritage multiple et destructeur ==> Erreur de segmentation ?? [Résolu]

Signaler
Messages postés
115
Date d'inscription
samedi 20 décembre 2003
Statut
Membre
Dernière intervention
23 août 2008
-
Messages postés
115
Date d'inscription
samedi 20 décembre 2003
Statut
Membre
Dernière intervention
23 août 2008
-
Bonjour à tous.

Voilà, j'ai une classe abstraite A :

class A{

    private:

        string m_name;

    public:

        A() {m_name = "default_name";}

        virtual ~A() {}

        virtual void print() = 0;

} ;

et une classe template dérivée de A et de list :

template< typename T >

class B : public A, public list<T> {

    public:

        B() : A() {}

        ~B() {}

} ;

Et dans mon main :

main()


{


    A *a = new B[100];


    delete[] a;


}



Le delete[] me donne une erreur de segmentation...
Notez que si je fais

A *a new B;

delete a;



tout marche bien.
D'où peut venir le problème ?

PS: désolé pour le gras j'ai pas réussi à l'enlever...
A voir également:

13 réponses

Messages postés
115
Date d'inscription
samedi 20 décembre 2003
Statut
Membre
Dernière intervention
23 août 2008
1
Ca y est j'ai trouvé !!

En fait il fallait faire un cast (statique ou dynamique) pour le delete[] :

int main()

{

    A *a = new B[100] ;

    delete[] static_cast< B* > (a) ;

    // OU delete[] dynamic_cast< B* > (a) ;

    return 0;

}

Mais bon c'est pas très pratique étant donné qu'il faut connaitre le type pour pouvoir le faire...

Si quelqu'un a d'autres suggestions qu'il n'hésite pas!

Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,

C'est pas un bug mais bien une erreur, on ne peut pas écrire A* a = new B[100];

un A n'a pas forcément la même taille qu'un B, donc on ne
peut pas voir un tableau de B comme un tableau de A (malgrés
le fait que B hérite bien de A).
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Une fois la fonction print définie pour la classe B, j'ai pu exécuter sans problème.
Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
16 août 2012
2
Idem pour moi. D'ailleurs sur mon compilateur ( VS2005 ), ton code ne compile pas si print() n'est pas défini. Quel compilateur utilises-tu ?
Messages postés
98
Date d'inscription
vendredi 17 février 2006
Statut
Membre
Dernière intervention
24 janvier 2018

Les méthodes virtuelles doivent être impérativement définies dans les classes dérivées ou je me trompe?
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
zaibacker : ce sont les fonctions virtuelles PURES qui doivent obligatoirement être implémentées, et même tu n'es pas obligé du moment que ta classe dérivée est une classe abstraite aussi.
Mais bon en effet dans la majorité des cas...
Messages postés
115
Date d'inscription
samedi 20 décembre 2003
Statut
Membre
Dernière intervention
23 août 2008
1
Ah oui, j'ai oublié de le dire dans le post, mais dans mon code print() est bien définie dans B.

J'utilise g++ (4.1.2).

Pas d'autres idées ? :-)

Messages postés
115
Date d'inscription
samedi 20 décembre 2003
Statut
Membre
Dernière intervention
23 août 2008
1
Quand je remplace, dans le main :

propertyBase *a = new property[100] ;

par

property *a = new property[100] ;

Ca fonctionne...
Peut-être un problème au niveau des destructeurs virtuels, c'est la première fois que je m'en sers, mais j'ai rien trouvé de très précis ni avec Google, ni dans mes 2 bouquins de 500 pages :/

Messages postés
115
Date d'inscription
samedi 20 décembre 2003
Statut
Membre
Dernière intervention
23 août 2008
1
Et quand je supprime la dérivation par list (ie B ne dérive que de A) ca fonctionne aussi.
Ce serait l'appel au destructeur de list qui poserait problème ? Oô

Là je rame... D'autant plus que le code fonctionne chez vous ^_^
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Normalement le fait de déclarer le destructeur virtual permet d'éviter cela puisque justement le bon destructeur sera appelé.
Messages postés
115
Date d'inscription
samedi 20 décembre 2003
Statut
Membre
Dernière intervention
23 août 2008
1
Alors c'est quoi? un bug de g++ ?

Je vais mettre à jour dans le doute...
Messages postés
115
Date d'inscription
samedi 20 décembre 2003
Statut
Membre
Dernière intervention
23 août 2008
1
Après MaJ de GCC (GNU Compiler Collection, v4.3.1), toujours le même soucis...

Je continue de chercher...

Messages postés
115
Date d'inscription
samedi 20 décembre 2003
Statut
Membre
Dernière intervention
23 août 2008
1
Je vais te croire sur parole, n'ayant rien pu trouver sur Internet (là je suis en train de fouiller « ISO/IEC 14882: Programming Language C++ » ... >_<")

Merci !