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

Messages postés
115
Date d'inscription
samedi 20 décembre 2003
Statut
Membre
Dernière intervention
23 août 2008
- - Dernière réponse : 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...
Afficher la suite 

13 réponses

Meilleure réponse
Messages postés
115
Date d'inscription
samedi 20 décembre 2003
Statut
Membre
Dernière intervention
23 août 2008
1
3
Merci
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!

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 136 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Rouliann
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
3
Merci
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).

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 136 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_aardman
Messages postés
968
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
0
Merci
Une fois la fonction print définie pour la classe B, j'ai pu exécuter sans problème.
Commenter la réponse de cs_juju12
Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
16 août 2012
2
0
Merci
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 ?
Commenter la réponse de cs_Lucky92
Messages postés
98
Date d'inscription
vendredi 17 février 2006
Statut
Membre
Dernière intervention
24 janvier 2018
0
Merci
Les méthodes virtuelles doivent être impérativement définies dans les classes dérivées ou je me trompe?
Commenter la réponse de zaibacker
Messages postés
968
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
0
Merci
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...
Commenter la réponse de cs_juju12
Messages postés
115
Date d'inscription
samedi 20 décembre 2003
Statut
Membre
Dernière intervention
23 août 2008
1
0
Merci
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 ? :-)

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

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

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

Je continue de chercher...

Commenter la réponse de Rouliann
Messages postés
115
Date d'inscription
samedi 20 décembre 2003
Statut
Membre
Dernière intervention
23 août 2008
1
0
Merci
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 !
Commenter la réponse de Rouliann