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

Langage C++ Discussion :

[Langage] Bogue à la suppresion d'un pointeur


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut [Langage] Bogue à la suppresion d'un pointeur
    Hello,

    J'ai une std::list de pointeurs.
    Les objets pointés ont été obtenus par un new.
    A un moment, je veux supprimer ces objets, et parcours donc ma liste en faisant des delete.

    Parfois, l'instruction delete plante ("Violation d'accès lors de la lecture..."), même en vérifiant au préalable que le pointeur n'est pas nul.

    Qu'est ce qui peut ainsi faire planter un delete ?
    Ca plante quand je sors du destructeur (vide) de l'objet concerné, après m'être tapé les destructeurs (également vides) de tous les ascendants.

    Des pistes ?

    Merci.

  2. #2
    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
    Pistes:
    -> débordement ailleurs,
    -> multiple appel à delete sur le même objet,
    -> parcours de la liste?.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Pourrais-tu détailler le 1er et le 2nd point, STP ?

  4. #4
    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
    Le premier point: quelque part dans le code, tu as un débordement mémoire qui vient écraser les données de ton objet.
    Exemple (bien sûr bug trivial):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    A *pA = new A();
    B *pB = new B();
    pA[1] = A();// Et bien, là tu charcute quelque part et tu ne sais pas où. Peut être en pB ou peut être pas.
    Le second point est encore plus simple. Tu a fais un delete sur un objet, et, tu refais un delete sur le même objet. C'est typique des classes qui ont des pointeurs qu'elles détruisent dans le destructeur et n'ont pas un constructeur de copie (ou une affectation) safe de ce point de vue. D'où les smart pointer (par exemple boost::shared_ptr)
    Exemple de code qui plante à 100%:
    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
     
    class A
    {
    public:
         A():m_MonTableau(new int[5]){}
        ~A(){delete []m_MonTableau;}
     
    protected:
        int *m_MonTableau;
    };
     
    int main()
    {
       A a;
       A b(a);
     
       return std::getc(stdin);
    }
    Ca se contourne avec plusieurs solutions:
    (bien: )
    1/ Ne pas utiliser de pointeur,
    2/ Utiliser une interface qui sait 'bien' les gérer (boost::smart pointers)
    (moins bien: )
    3/ Redéfinir les constructeurs de copy et les affectations pour réallouer le buffer (c'est moins bien parce que tu risques toujours d'oublier un truc et puis tu refais le boulot à chaque fois)
    4/ Gérer un compteur de référence sur les buffers (en gros, faire tes propres smart pointer) (c'est moins bien parce que d'autres l'ont fait avant toi et souvent c'est mieux ).

  5. #5
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Je te renvoie sur la FAQ: Comment détruire les pointeurs d'un conteneur ?
    l'instruction delete plante ("Violation d'accès lors de la lecture..."), même en vérifiant au préalable que le pointeur n'est pas nul.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int * p_int= NULL;
    delete p_int;
    Est tout à fait correct.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Merci !

    Et le point 3 ?

    Je pense que ce n'est aucun des 2 premiers.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    il semble finalement que j'essaye effectivement de détruire une carcasse de pointeur. Va maintenant falloir trouver ce qui a pulvérisé l'objet pointé.

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

Discussions similaires

  1. [Langage] probleme de pointeur pour la fonction strcat
    Par claire_cartier dans le forum Langage
    Réponses: 5
    Dernier message: 19/11/2008, 17h22
  2. [Langage] pointeur de fonction membre
    Par uriotcea dans le forum Langage
    Réponses: 17
    Dernier message: 31/10/2008, 15h45
  3. Prob : Suppresion instance d'un vecteur de pointeurs
    Par Julien_C++ dans le forum C++
    Réponses: 5
    Dernier message: 01/04/2007, 20h50
  4. Réponses: 9
    Dernier message: 14/01/2007, 16h40
  5. [langage] Pointeur sur fonction
    Par Fanch.g dans le forum Langage
    Réponses: 2
    Dernier message: 02/10/2004, 10h43

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