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

C++ Discussion :

delete sur une classe predeclarer


Sujet :

C++

  1. #1
    Membre régulier Avatar de Moine
    Inscrit en
    Mars 2006
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 210
    Points : 90
    Points
    90
    Par défaut delete sur une classe predeclarer
    Salut tout le monde,

    pour résoudre un problème de référence croisée j'ai dû faire une pré déclaration. Quand je fait un delete de la classe pré déclarer dans le destructeur j'obtiens un segmentation fault.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class A;
     
    class B
    {
      A *t;
    B(){ t = new A();}
    ~B(){ delete t;} //segmentation fault à l'execution 
    }
    même chose avec
    Je voudrais comprendre ce qui se passe, pourquoi le delete ne fonction pas. ça me parait bizard

  2. #2
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    En quoi ton code expose le problème ?

  3. #3
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Ta description est un peu légère,

    Peux tu montrer comment A et B interagissent entre elles,
    As tu des relations d'héritage, d'amitié entre elles.
    Quels méthode de B implique/utilise A et inversement.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 349
    Points : 379
    Points
    379
    Par défaut
    Est-ce que ta classe A détruit un élément de type B dans son destructeur?

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Le code fourni ne peut compiler.
    Merci de fournir un exemple réduit qui exhibe le problème.

  6. #6
    Membre régulier Avatar de Moine
    Inscrit en
    Mars 2006
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 210
    Points : 90
    Points
    90
    Par défaut delete sur une classe predeclarer
    Citation Envoyé par Cheps Voir le message
    Est-ce que ta classe A détruit un élément de type B dans son destructeur?
    non, nul part je ne fait ça.

    J'ai exécute le code avec la partie à problème en commentaire, j'ai eu droit au segmentation fault des fois et souvent rien, je me dis donc qu'il s'agit d'un problème de fuite de mémoire.

    si quelqu'un peu me dire comment pister une fuite de mémoire avec code block, avec ça j'arriverais sans doute à résoudre mon problème. merci

  7. #7
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par Moine Voir le message
    non, nul part je ne fait ça.

    J'ai exécute le code avec la partie à problème en commentaire, j'ai eu droit au segmentation fault des fois et souvent rien, je me dis donc qu'il s'agit d'un problème de fuite de mémoire.

    si quelqu'un peu me dire comment pister une fuite de mémoire avec code block, avec ça j'arriverais sans doute à résoudre mon problème. merci
    fuite memoire (valgrind si tu es sous linux) ou
    multithreading, si un thread s'amuse à te modifier/détruire A pendant que tu le détruit ça peux faire ce genre de chose.

  8. #8
    Membre régulier Avatar de Moine
    Inscrit en
    Mars 2006
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 210
    Points : 90
    Points
    90
    Par défaut delete sur une classe predeclarer
    merci pour Valgrind, je m'en vais voir à quoi il ressemble.

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 588
    Points
    41 588
    Par défaut
    Je suis étonné qu'un delete sur un type incomplet compile: Le compilateur ne saurait pas où trouver le destructeur, et même s'il suppose, il ne saurait pas s'il est virtuel ou non!

  10. #10
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Un problème de RAII ? Besoin d'un pointeur intelligent pour éviter un double delete ?

  11. #11
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    Je vois 2 explications possibles:
    1. t n'est pas initialisé (il aura une valeur du type 0xcdcdcdcd), ce qui signifie que ton constructeur par défaut n'est pas appelé
    2. t a déjà été effacé (double delete, comme dit 3DArchi), auquel cas il faut chercher ailleurs dans ton code

  12. #12
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Je suis étonné qu'un delete sur un type incomplet compile: Le compilateur ne saurait pas où trouver le destructeur, et même s'il suppose, il ne saurait pas s'il est virtuel ou non!
    Oui c'est vrai c'est étrange, mais ça compile (et ça merche). Je suppose que lors de la compilation de B, le compilo se contente de savoir que A existe, en laissant un pointeur vide pour le delete (et autres références à A). Et lorsque, plus tard, A et ses descendants sont compilés, il remplit ces adresses vide (¿?)

  13. #13
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par r0d Voir le message
    Oui c'est vrai c'est étrange, mais ça compile (et ça merche). Je suppose que lors de la compilation de B, le compilo se contente de savoir que A existe, en laissant un pointeur vide pour le delete (et autres références à A). Et lorsque, plus tard, A et ses descendants sont compilés, il remplit ces adresses vide (¿?)
    C'est plus tarabiscoté que ça. Cf mes posts Les pièges de l'opérateur delete et std::auto_ptr<> et fuite de mémoire sur mon blog.

    En gros, pour résumer, si on delete un type incomplet T, la plupart des compilateurs se contente de fournir un destructeur trivial inline implicite à ce type incomplet. Bien évidemment, ce destructeur ne fait rien. l'opérateur delete libère donc seulement la mémoire utilisée par l'instance de T, mais n'appelle pas son véritable destructeur.

    En ce qui concerne l'erreur de l'OP, j'aurais tendance à dire qu'une séance de debug avec un debugger correct devrait lever le problème. A moins que la mémoire ait déjà été libérée ou que t soit invalide, le code ne devrait pas planter (non, une fuite de mémoire ne provoque pas de plantage). Pour trouver la cause réelle au problème, il me semble que plus de code serait le bienvenu.

Discussions similaires

  1. [C++] pointeur sur une classe
    Par PH69 dans le forum Débuter
    Réponses: 1
    Dernier message: 21/11/2005, 23h08
  2. Création dynamique de méthode sur une classe ?
    Par elitost dans le forum Général Java
    Réponses: 9
    Dernier message: 18/10/2005, 15h47
  3. Réponses: 14
    Dernier message: 14/03/2005, 10h16
  4. delete sur une vue: rule
    Par Bouboubou dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 18/05/2004, 19h58
  5. [MFC] Problème pointeur sur une classe
    Par mick74 dans le forum MFC
    Réponses: 7
    Dernier message: 14/04/2004, 15h17

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