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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 86
    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

  2. #2
    Membre éclairé 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
    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 confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 86
    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

  4. #4
    Membre éclairé 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
    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 confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 86
    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.

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 86
    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

  7. #7
    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
    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)
     			}

+ 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