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 :

probleme de destruction de pointeur


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 86
    Points : 67
    Points
    67
    Par défaut probleme de destruction de pointeur
    Salut,
    j'ai un petit soucis de plantage d'un prog,
    voici mon code, un probleme memoire survient lors de la ligne pointée
    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
     
    // data_recep est de type string.
    			istringstream* flux_recu = new istringstream;
    			char* pdata_recep = new char;
     
    // je stocke data recep dans le flux, puis je reutilise data_recep 
    //pour ma comparaison plus bas
    			flux_recu->str(data_recep); 
    			flux_recu->read(pdata_recep,19); 
     
    //toujours type string.
    			data_recep="*00019001"+commandes[26].code;
     
    			if (strcmp(pdata_recep,data_recep.c_str())==0)
    			{
    				cout << "recu bonne ligne\n";
    				nb_mot=0;
    				while (std::getline(*flux_recu,mot,':'))
    				{
    					mots[nb_mot++]=mot;
    					cout << mot;
    				}
    				if (nb_mot > 100)
     
    			}
    >>>>		delete pdata_recep; <<<<  
    			delete flux_recu;
    je ne vois pas le probleme, est ce que pdata_recep continue a pointer sur quelque chose que je ne peux pas detruire?
    je vois pas!
    merci de votre aide
    dom
    Au début j'avais pensé à une énorme tapette à souris géante...

  2. #2
    Membre actif Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Points : 203
    Points
    203
    Par défaut
    je vais peut-etre dire une betise, mais a tes 2 premières lignes, lors des new, tu devrait mettre des ():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    new istringstream();
    new char();
    Est-ce que ça change quelque chose?

    EDIT: je vois un autre probleme: quand tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    flux_recu->read(pdata_recep,19);
    ça va copier 19 caracteres dans un buffer pointé par pdata_recep.
    Mais tu as pas alloué 19 caractères a ton buffer...
    il faut faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* pdata_recep = new char[19];
    et ensuite la destruction_

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 86
    Points : 67
    Points
    67
    Par défaut
    j'ai éssayé, mais le probleme persiste le compilateur ne m'avais rien dit.

    EDIT

    J'avais pensé a cette solution, et je m'etais dit que ce n'etait pas ca.... mais l'erreur c'est que mon delete je l'avais laissé comme ca:
    j'essaie de suite
    Au début j'avais pensé à une énorme tapette à souris géante...

  4. #4
    Membre actif Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Points : 203
    Points
    203
    Par défaut
    j'ai fait un EDIT de mon post précédent entre-temps. Est-ce que tu l'as lu? tu as essayé ça aussi?

  5. #5
    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
    L'erreur principale viens du fait que tu alloue une zone mémoire pour 1 char
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* pdata_recep = new char;
    que tu remplie ensuite avec 19 chars !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    flux_recu->read(pdata_recep,19);
    Plus globalement, il vaut mieux éviter en C++ d'utiliser des pointeurs à tout va, c'est source d'erreurs et de complications.

    Par exemple le même code sans pointeurs donnerai ça
    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
    // data_recep est de type string.
    			istringstream flux_recu;
    			char pdata_recep[19];
     
    // je stocke data recep dans le flux, puis je reutilise data_recep 
    //pour ma comparaison plus bas
    			flux_recu.str(data_recep); 
    			flux_recu.read(pdata_recep,19); 
     
    //toujours type string.
    			data_recep="*00019001"+commandes[26].code;
     
    			if (pdata_recep == data_recep)
    			{
    				cout << "recu bonne ligne\n";
    				nb_mot=0;
    				while (std::getline(flux_recu,mot,':'))
    				{
    					mots[nb_mot++]=mot;
    					cout << mot;
    				}
    				if (nb_mot > 100)
     			}

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 86
    Points : 67
    Points
    67
    Par défaut
    bon, j'ai toujours un beau "segmentation fault"
    pour revenir a la solution du [19], est ce que ca reserve bien 19 octets? lorsque je fais le debugage, (en pas a pas) il me reserve 21 octets! du coup les 19 caracteres sont biens copiés mais il reste 2 caracteres aléatoires, ce qui conduit a une comparaison forcement fausse
    lorsque j'ai laissé sans taille, les débugage marche bien, j'ai bien la bonne taille, la comparaison se fait bien etc, mais c'est a la destruction que ca flanche, comme avec le [19] d'ailleurs.
    Au début j'avais pensé à une énorme tapette à souris géante...

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 86
    Points : 67
    Points
    67
    Par défaut
    c'est vrai sylvain!
    comme j'ai essayé de prendre l'habitude d'utiliser le string, et que la fonction read me prend un char* je me suis dit allons y pour un char* ! et je n'ai meme pas pensé une seconde a faire un tableau tout bete !! j'ai pas essayé mais je pense que c'est bon
    je ferais un EDIT

    EDIT:
    Bon et bien merci à tous les deux, voila une affaire rondement menée!
    A+ dom
    Au début j'avais pensé à une énorme tapette à souris géante...

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

Discussions similaires

  1. Probleme de destruction ShellTreeView
    Par patachat dans le forum Delphi
    Réponses: 1
    Dernier message: 07/03/2007, 22h12
  2. Problèmes avec classes et pointeurs
    Par Anas1984 dans le forum C++
    Réponses: 2
    Dernier message: 02/11/2006, 12h49
  3. Réponses: 2
    Dernier message: 06/09/2006, 22h04
  4. [LG]problème de tri de pointeur (bulles non optimisé)
    Par blackmage dans le forum Langage
    Réponses: 3
    Dernier message: 20/11/2003, 23h42
  5. Probleme de destruction
    Par Merluco dans le forum Langage
    Réponses: 6
    Dernier message: 30/06/2003, 13h51

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