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 :

Invalid pointer avec librairie stl


Sujet :

C++

  1. #1
    Membre éprouvé Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Points : 948
    Points
    948
    Par défaut Invalid pointer avec librairie stl
    Bonjour tout le monde,

    Voila depuis peu je développe en C++ et je suis confronté à un problème que je n'arrive pas à comprendre... J'ai une classe Etudiants, en gros je range chaque étudiant crée dans un "vector" (donc de la librairie stl), j'ai ensuite une procédure censé écrire dans un fichier texte les informations relatives aux étudiants, sauf que le parcours ne se passe pas bien

    _ Voici le code de la procédure :
    Code c++ : 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
    void Ecriture_Fichier(){
     
       ofstream fichier("Reservation.txt",ios::out | ios::trunc);
      if(!fichier){
        cerr << "Erreur lors de l'ouverture du fichier reservation.txt" << endl;
      }
      else{
     
         for(int i=0;i<LesEtudiants.size();i++){
     
          fichier << LesEtudiants[i].numero() << " " <<  LesEtudiants[i].nom() << " " <<  LesEtudiants[i].prenom() << " " <<  LesEtudiants[i].annee() << " Etudiant " <<  LesEtudiants[i].mail() << " " <<  LesEtudiants[i].DateReservation() << " " <<  LesEtudiants[i].paye() << " et test" << endl; 
     
          }
        fichier.close();
        }
     
    }

    _ Voici l'erreur au moment de l'exécution :
    *** glibc detected *** ./gala: free(): invalid pointer: 0xb7742ff4 ***
    ======= Backtrace: =========
    /lib/tls/i686/cmov/libc.so.6[0x4ffff1]
    /lib/tls/i686/cmov/libc.so.6[0x5016f2]
    /lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0x5047cd]
    /usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0xf316f1]
    /usr/lib/libstdc++.so.6(_ZNSs4_Rep10_M_destroyERKSaIcE+0x1d)[0xf0f35d]
    /usr/lib/libstdc++.so.6(_ZNSsD1Ev+0x4c)[0xf10d6c]
    ./gala[0x804b039]
    ./gala[0x804bee6]
    /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0x4abb56]
    ./gala[0x80493e1]
    ======= Memory map: ========
    00110000-0012c000 r-xp 00000000 08:05 11973 /lib/libgcc_s.so.1
    0012c000-0012d000 r--p 0001b000 08:05 11973 /lib/libgcc_s.so.1
    0012d000-0012e000 rw-p 0001c000 08:05 11973 /lib/libgcc_s.so.1
    00495000-005d3000 r-xp 00000000 08:05 9046 /lib/tls/i686/cmov/libc-2.10.1.so
    005d3000-005d4000 ---p 0013e000 08:05 9046 /lib/tls/i686/cmov/libc-2.10.1.so
    005d4000-005d6000 r--p 0013e000 08:05 9046 /lib/tls/i686/cmov/libc-2.10.1.so
    005d6000-005d7000 rw-p 00140000 08:05 9046 /lib/tls/i686/cmov/libc-2.10.1.so
    005d7000-005da000 rw-p 00000000 00:00 0
    00667000-00668000 r-xp 00000000 00:00 0 [vdso]
    0085d000-00878000 r-xp 00000000 08:05 16348 /lib/ld-2.10.1.so
    00878000-00879000 r--p 0001a000 08:05 16348 /lib/ld-2.10.1.so
    00879000-0087a000 rw-p 0001b000 08:05 16348 /lib/ld-2.10.1.so
    008cf000-008f3000 r-xp 00000000 08:05 9050 /lib/tls/i686/cmov/libm-2.10.1.so
    008f3000-008f4000 r--p 00023000 08:05 9050 /lib/tls/i686/cmov/libm-2.10.1.so
    008f4000-008f5000 rw-p 00024000 08:05 9050 /lib/tls/i686/cmov/libm-2.10.1.so
    00e79000-00f5f000 r-xp 00000000 08:05 10126 /usr/lib/libstdc++.so.6.0.13
    00f5f000-00f63000 r--p 000e6000 08:05 10126 /usr/lib/libstdc++.so.6.0.13
    00f63000-00f64000 rw-p 000ea000 08:05 10126 /usr/lib/libstdc++.so.6.0.13
    00f64000-00f6b000 rw-p 00000000 00:00 0
    08048000-08053000 r-xp 00000000 08:05 263510 /home/yves/Bureau/POO/gala
    08053000-08054000 r--p 0000a000 08:05 263510 /home/yves/Bureau/POO/gala
    08054000-08055000 rw-p 0000b000 08:05 263510 /home/yves/Bureau/POO/gala
    090dc000-090fd000 rw-p 00000000 00:00 0 [heap]
    b7600000-b7621000 rw-p 00000000 00:00 0
    b7621000-b7700000 ---p 00000000 00:00 0
    b772e000-b7730000 rw-p 00000000 00:00 0
    b7742000-b7746000 rw-p 00000000 00:00 0
    bff66000-bff7b000 rw-p 00000000 00:00 0 [stack]
    22/4/2010Abandon
    Merci d'avance.

    EDIT : Même erreur avec un iterator :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    vector <Etudiant>::iterator ie;
    vector <Etudiant> LesEtudiants;
    /*
    ....
    */
    for(ie=LesEtudiants.begin();ie<LesEtudiants.end();ie++){
     
          fichier << ie->numero() << " " <<  ie->nom() << " " <<  ie->prenom() << " " <<  ie->annee() << " Etudiant " <<  ie->mail() << " " <<  ie->DateReservation() << " " <<  ie->paye() << " et test" << endl; 
     
          }
    ►Ne pas oublier le

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Il n'y a pas d'erreur dans le code ci-dessus, le problème doit être ailleurs !

  3. #3
    Membre éprouvé Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Points : 948
    Points
    948
    Par défaut
    Oui je m'en rends bien compte :s Le fait est que lorsque je met ce bout de code en commentaire tout se passe bien (enfin en tout cas je n'ai aucune erreur qui s'affiche).

    Peut être es-ce lors du remplissage que ca crée des conflits ? Voila comment je le rempli :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    vector <Etudiant>::iterator ie;
    vector <Etudiant> LesEtudiants;
    /*
    ....
    */
    Etudiant e(t[0].nom,t[0].prenom,t[0].mail, a, b ,paye);
    LesEtudiants.push_back(e);
    ►Ne pas oublier le

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    1- Pourrais tu nous montrer ta classe Etudiants, s'il te plait

    2- Peut être devrais tu envisager de définir une fonction print ou l'opérateur << pour les étudiants

    Cela te permettrait d'avoir une boucle plus simple prenant la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(int i=0;i<LesEtudiants.size();i++){
        fichier<<LesEtudiants[i];
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre éprouvé Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Points : 948
    Points
    948
    Par défaut
    Bonjour, merci de la réponse voici la classe Etudiant (qui hérite d'une classe Personne)

    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
    #ifndef H_ETUDIANT
    #define H_ETUDIANT
    #include <iostream>
    #include <string.h>
    #include "Personne.h"
     
     
    using namespace std;
     
    class Etudiant:public Personne{
     protected:
      static const double d_Tarif=20;
      int i_Numero;
      int i_Anneetu;
      Personne * invite;
     
     public:
     Etudiant(string nom,string prenom,string mail,int annee,int num, bool paye):Personne(nom,prenom,mail,paye){i_Anneetu=annee;i_Numero=num;}; 
      ~Etudiant();
      inline int numero(){return i_Numero;}
      inline int annee(){return i_Anneetu;}
     
     
    };
    #endif
    Pour la remarque numéro 2, c'est une excellente idée qui ne m'étais pas du tout venu à l'esprit ca rendra le code plus clair même si bien sur cela ne résout pas le problème en soi

    Et sinon pour info on suppose que mon vecteur a 2 étudiants. Ben dans le fichier texte il écrit le premier, mais pas le second en fait (donc il coince sur le dernier étudiant à écrire)
    ►Ne pas oublier le

  6. #6
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Ta classe gère un pointeur, tu dois définir un constructeur de copie et un operateur d'affectation.

    Cf FAQ, google ou le prochain post de Koala qui fera sans doute 2 pages
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  7. #7
    Membre éprouvé Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Points : 948
    Points
    948
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Ta classe gère un pointeur, tu dois définir un constructeur de copie et un operateur d'affectation.

    Cf FAQ, google ou le prochain post de Koala qui fera sans doute 2 pages
    Aïe je crains le coup de bâton ! ^^ Au risque de m'enfoncer plus le fait que je ne manipule pas ce pointeur (car en fait ni dans le constructeur ni dans aucune méthode je ne l'utilise) a t-il réellement un impact sur l'erreur que j'ai ?

    Je viens de mettre l'attribut "invite" en commentaire et l'erreur est toujours similaire, en revanche je veux quand même les deux pages histoire que je comprenne bien l'idée derrière
    ►Ne pas oublier le

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    S'il n'est pas utilisé du tout, ça devrait aller... Mais qu'y a-t-il donc dans la classe Personne dont dérive étudiant ? N' y aurait-il pas là des pointeurs que tu utilises, et une absence de constructeur de copie/opérateur= ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  9. #9
    Membre éprouvé Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Points : 948
    Points
    948
    Par défaut
    Corrigé !!!!!

    Donc voila j'explique les choses que j'ai modifié

    _ Donc dans la classe Personne j'ai rajouté le constructeur par copie (je n'avais aucun pointeur sinon).
    _ Lorsque j'écris dans le fichier j'ai viré la méthode "DateReservation" qui m'a ressorti une belle erreur de segmentation (faut que je vois d'où ca vient).

    En tout cas maintenant ca fonctionne bien !

    Merci encore
    ►Ne pas oublier le

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

Discussions similaires

  1. Problème avec librairie iostream.h
    Par Rafoo dans le forum MFC
    Réponses: 3
    Dernier message: 22/07/2005, 13h20
  2. Architecture multi couches avec librairie borland?
    Par seb_asm dans le forum JBuilder
    Réponses: 4
    Dernier message: 08/06/2005, 10h14
  3. Problème de construction avec la STL
    Par gelam dans le forum SL & STL
    Réponses: 19
    Dernier message: 01/05/2005, 12h41
  4. Arbre binaire avec la STL ?
    Par SteelBox dans le forum SL & STL
    Réponses: 9
    Dernier message: 10/11/2004, 13h22
  5. [Kylix] [BCB] pb avec la STL
    Par pykoon dans le forum EDI
    Réponses: 1
    Dernier message: 29/12/2002, 12h56

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