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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    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; 
     
          }

  2. #2
    Membre émérite

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

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

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

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    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);

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    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 émérite Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    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)

  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 : 33
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    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)

+ 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