Héritage multiple et destructeur ==> Erreur de segmentation ??

Résolu
Rouliann Messages postés 115 Date d'inscription samedi 20 décembre 2003 Statut Membre Dernière intervention 23 août 2008 - 20 août 2008 à 15:03
Rouliann Messages postés 115 Date d'inscription samedi 20 décembre 2003 Statut Membre Dernière intervention 23 août 2008 - 23 août 2008 à 00:42
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...

13 réponses

Rouliann Messages postés 115 Date d'inscription samedi 20 décembre 2003 Statut Membre Dernière intervention 23 août 2008 1
22 août 2008 à 12:20
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!

3
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
22 août 2008 à 22:32
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).
3
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
20 août 2008 à 17:07
Une fois la fonction print définie pour la classe B, j'ai pu exécuter sans problème.
0
cs_Lucky92 Messages postés 180 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 16 août 2012 2
20 août 2008 à 18:36
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 ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
zaibacker Messages postés 97 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 24 janvier 2018
21 août 2008 à 10:34
Les méthodes virtuelles doivent être impérativement définies dans les classes dérivées ou je me trompe?
0
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
21 août 2008 à 16:07
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...
0
Rouliann Messages postés 115 Date d'inscription samedi 20 décembre 2003 Statut Membre Dernière intervention 23 août 2008 1
21 août 2008 à 22:05
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 ? :-)

0
Rouliann Messages postés 115 Date d'inscription samedi 20 décembre 2003 Statut Membre Dernière intervention 23 août 2008 1
21 août 2008 à 22:21
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 :/

0
Rouliann Messages postés 115 Date d'inscription samedi 20 décembre 2003 Statut Membre Dernière intervention 23 août 2008 1
21 août 2008 à 23:34
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 ^_^
0
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
22 août 2008 à 12:29
Normalement le fait de déclarer le destructeur virtual permet d'éviter cela puisque justement le bon destructeur sera appelé.
0
Rouliann Messages postés 115 Date d'inscription samedi 20 décembre 2003 Statut Membre Dernière intervention 23 août 2008 1
22 août 2008 à 14:25
Alors c'est quoi? un bug de g++ ?

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

Je continue de chercher...

0
Rouliann Messages postés 115 Date d'inscription samedi 20 décembre 2003 Statut Membre Dernière intervention 23 août 2008 1
23 août 2008 à 00:42
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 !
0
Rejoignez-nous