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 invalid pointer


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2011
    Messages : 18
    Par défaut Delete invalid pointer
    Bonjour,

    j'ai un problème lorsque je veux
    libérer la mémoire allouée dans une classe.

    J'ai un vecteur de vecteur d'une classe Test

    que j'initialise dans le constructeur comme ceci:


    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
      matrice.resize(6);
     
     
       vector<vector<Test> >::iterator i;
       vector<Test>::iterator j;
     
       for (i = matrice.begin(); i != matrice.end(); ++i)
       {
          i->resize(7);
     
          for (j = i->begin(); j != i->end(); ++j)
          {
     
             Slot& s = *(new Test());
             *j = s;
     
          }
       }
    Lorsque j'essaye de libérer la mémoire dans le destructeur avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
       for (i = matrice.begin(); i != matrice.end(); ++i)
       {
     
          for (j = i->begin(); j != i->end(); ++j)
          {
     
             Test &s = *j;
     
             delete &s;
     
          }
       }
    Le compilateur me dit que le pointeur est invalide je suis un débutant
    en c++ et je ne trouve pas une solution à mon problème.

  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
    Salut,
    réalise une copie complète de l'objet. Par défaut, en C++, tu manipules des valeurs et non leur référence contrairement à d'autres langages (type java ou C#). Donc au moment du delete, ce n'est pas du tout le bon pointeur que tu supprimes. Le pointeur alloué, en fait, tu l'as perdu.

    La solution :
    1/Supprimer les allocations dynamiques (surtout si ta classe n'a pas de sémantique d'entité)

    2/ Utiliser des pointeurs intelligents si tu as vraiment besoin.

    Ne jamais oublier que la STL (et ses algos) est ton amie

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #include <vector>
    #include <algorithm>
    #include <boost/shared_ptr.hpp>
     
    struct Slot{};
    struct Test : public Slot{};
     
    template<class T>
    boost::shared_ptr<T> factory()
    {
        return boost::shared_ptr<T>(new T);
    }
     
    void add_line(std::vector<boost::shared_ptr<Slot> > &v_)
    {
        v_.resize(7);
        std::generate(v_.begin(),v_.end(),factory<Test>);
    }
     
    int main()
    {
        std::vector<std::vector<boost::shared_ptr<Slot> > > matrice;
     
        matrice.resize(6);
        std::for_each(matrice.begin(),matrice.end(),add_line);
     
       return 0;
    }
    un peu plus agréable à lire avec les lambda de C++0x :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #include <vector>
    #include <algorithm>
    #include <memory>
     
    struct Slot{};
    struct Test : public Slot{};
     
    typedef std::shared_ptr<Slot> ptrSlot;
    typedef std::vector<ptrSlot> vector_ptrSlot;
    typedef std::vector<vector_ptrSlot> matrice_ptrSlot;
     
    int main()
    {
        matrice_ptrSlot matrice;
     
        matrice.resize(6);
        std::for_each(
            matrice.begin()
            ,matrice.end()
            ,
            [](vector_ptrSlot &v_)
            {
                v_.resize(7);
                std::generate(v_.begin(),v_.end(),
                [](){return std::shared_ptr<Test>(new Test);}
                );
            }
        );
     
       return 0;
    }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2011
    Messages : 18
    Par défaut
    Ca me pique un peu les yeux quand même.

    Je vais vraiment essayer d'éviter les allocations dynamique pour les prochaines fois. Merci beaucoup !

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Slot& s = *(new Test());


    Ça, c'est un truc à ne jamais faire: Tu emmêles les pointeurs et les références. delete &s est tout aussi sale.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Erreure à l'execution, invalid Pointer
    Par renépaul dans le forum C++
    Réponses: 6
    Dernier message: 18/04/2012, 13h36
  2. Invalid pointer avec librairie stl
    Par obito dans le forum Débuter
    Réponses: 8
    Dernier message: 23/04/2010, 16h56
  3. 0x80004003 (NS ERROR INVALID POINTER)
    Par crocodile dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/12/2009, 20h14
  4. qu'est ce que 'Invalid pointer operation' ?
    Par savoir dans le forum Langage
    Réponses: 4
    Dernier message: 24/08/2009, 00h53
  5. * glibc detected * free(): invalid pointer
    Par ViRouF dans le forum C
    Réponses: 4
    Dernier message: 28/03/2007, 17h10

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