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

SL & STL C++ Discussion :

erreur d'initialisation consécutive de 2 pointeurs string


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Par défaut erreur d'initialisation consécutive de 2 pointeurs string
    Bonjour,
    Je viens d'experimenter une erreur qui me parait completement absurde et pour le moins incompréhensible.
    Le cas d'erreur est le suivant:
    je déclare 2 pointeurs vers des string (de la librairie standard) dans les attributs publics d'une classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class Simulation
    {
    public:
         string* chaine1;
         string* chaine2;
    ...
    }
    Lorsque je défini le constructeur, j'initialise ces pointeurs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Simulation::Simulation()
    {
          chaine1 = new string();
          chaine2 = new string();
    }
    Je ne fais rien d'autre avec ces chaines, je ne les utilise même pas par la suite. Le simple fait d'initialiser 2 chaines consécutivement me produit une erreur lors de l'execution du programme!
    Je précise consécutivement, car lorsque je n'initialise qu'une classe à la fois, aucune erreur ne se produit, par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Simulation::Simulation()
    {
          chaine1 = new string();
          //chaine2 = new string();
    }
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Simulation::Simulation()
    {
          //chaine1 = new string();
          chaine2 = new string();
    }
    marchent!!
    Je déteste ce genre d'erreur qui ont le don de vous rendre dingue, si quelqu'un peut voir d'ou cela vient ca m'arrangerait ne serait ce que pour comprendre car la ca me dépasse!

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    des pointeur sure des string?????
    pourquoi faire?????

    Citation Envoyé par dukeraoul Voir le message
    Je ne fais rien d'autre avec ces chaines, je ne les utilise même pas par la suite. Le simple fait d'initialiser 2 chaines consécutivement me produit une erreur lors de l'execution du programme!
    Je précise consécutivement, car lorsque je n'initialise qu'une classe à la fois, aucune erreur ne se produit, par exemple:
    Si tu n'as pas un peu plus de code, ca va être dure de t'aider. L'erreur est surement ailleurs, une erreur mémoire.

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Par défaut
    d'abord merci pour la réponse immédiate
    j'ai édité mon message précédent car j'avais oublié les étoiles
    en fait j'ai besoin de ces 2 pointeurs vers des chaines de caractère pour les passer à une fonction.
    Peut-etre qu'il y a une autre méthode? Je suis preneur..
    Mais l'erreur n'en reste pas moins absurde! Pourquoi n'aurais je le droit d'initialiser qu'une chaine et pas 2? (et j'ai changé le nom de mes variables pour être sûr qu'elles nétaient pas présente autre part dans le code)
    Je veux bien que l'erreur viennent d'ailleurs mais je n'utilise pas des ces 2 chaines autre part pour le moment.. et l'execution marchent bien en déclarant qu'une variable.. je suis pas expert mais la ca me parait vraiment bizarre.
    Je veux bien poster plus de code mais ca n'aidera pas forcément plus:

    Voici le code dans mon fichier Simulation.h:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Simulation
    {
    public:
    	float PE_Prob, Compt_Prob, PP_Prob, Col_Prob, XRay_Prob, nrjLoss, nrjPh, nrjEl, nrjPos, thetaPhot, phiPhot, thetaElec, phiElec, thetaPos, phiPos, theta2Pho, phi2Pho;
     
    	string* interType;
    	string* errorMsg;
     
    	Simulation();
    	void initializeSim();
    	void runSim();
    	void terminateSim();
     
    };
    et voici en partie le code de mon fichier cpp, Simulation.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include "PartInter.h"
    #include "mylib.h"
     
    Simulation::Simulation()
    {
    	//errorMsg = new string("");
    	interType = new string("sdger");
     
    }
    Comme on le voit j'ai commenté la premiere ligne errorMsg, ce qui fait que le programme s'execute. Des que je décommente cette ligne le programme produit une erreur. Si ne commente la 2eme ligne (intertype), le programme marche à nouveau!
    Je ne pense pas que cela viennent du fait que je ne précise pas le namespace std?? Visual Studio à l'air de reconnaitre directement, il m'indique bien le bon type.

  4. #4
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Par défaut
    petite précision, Simulation.h est inclus dans PartInter.h

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par dukeraoul Voir le message
    en fait j'ai besoin de ces 2 pointeurs vers des chaines de caractère pour les passer à une fonction.
    Peut-etre qu'il y a une autre méthode? Je suis preneur..
    par référence? se sera plus propre. string n'as aucun intérêt à être alloué par un new. Elle sert d'interface RAII pour un tableau de char.


    Mais l'erreur n'en reste pas moins absurde! Pourquoi n'aurais je le droit d'initialiser qu'une chaine et pas 2? (et j'ai changé le nom de mes variables pour être sûr qu'elles nétaient pas présente autre part dans le code)
    Je veux bien que l'erreur viennent d'ailleurs mais je n'utilise pas des ces 2 chaines autre part pour le moment.. et l'execution marchent bien en déclarant qu'une variable.. je suis pas expert mais la ca me parait vraiment bizarre.
    Je le répète. L'erreur n'est pas ici. Tu doit faire une erreur mémoire ailleurs, ce qui créé un comportement indéfinie. Eteind ton ordi, redémarre et réessaye, y as des chance que tu n'est pas le même problème.


    Lorsque tu met du code, peut tu utiliser les balise ou le bouton #

    merci

  6. #6
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Par défaut
    Oups désolé pour le code, j'ai pas l'habitude de poster.
    Bon déjà ce que tu me dit m'avance, je ne savais pas qu'on pouvait avoir un comportement indéfini, je pensais que ca produisait toujours la même chose.. ce qui pourrait effectivement expliqué mon erreur.
    Merci pour les conseils je vais tenter de redemarrer pour voir si mon programme réagit différement.

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par dukeraoul Voir le message
    Oups désolé pour le code, j'ai pas l'habitude de poster.
    no problème

    Citation Envoyé par dukeraoul Voir le message
    Merci pour les conseils je vais tenter de redémarrer pour voir si mon programme réagit différemment.
    Tu n'est pas non plus obligé d'aller jusque là.

    Si tu peut mettre un peut plus de code, on pourra peut être t'aider. As tu essayer d'utiliser un debugueur?

  8. #8
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Par défaut
    Il s'agissait bien d'une erreur autre part!
    J'ai commenté une autre partie de mon code qui me parraissait sensible, et les 2 initialisation marchent maintenant.
    C'est dingue tout de même ces erreurs de mémoire, ca m'avait déja joué des tours avec les printf de debug en C juste avant seg fault qui ne voulait pas s'afficher (j'étais obligé d'en coller au moins 2-3 avant l'erreur)!
    Je ne sais pas si ce genre d'erreur "aléatoire" se produirait en langages managés genre C# ou Java mais c'est ce qui me fait détester le C!
    Merc au moins j'aurais appris quelques chose..

  9. #9
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Ces comportements indéfinis semblent tout à fait prévisible dans ton code au vu de ton utilisation des pointeurs. Ne les utilisent que quand tu n'as pas le choix (et meme dans ce cas des smart_ptr conviennent mieux bien souvent).

    Essayes avec des référence comme te la conseillé Mongaulois et tu verras ton problème disparaitre. (100 %¨garantit)

    Ps: pas sur q'un GC te sauverait sur ce coup

Discussions similaires

  1. Erreur de conversion de type Null en String
    Par navis84 dans le forum Bases de données
    Réponses: 3
    Dernier message: 26/07/2005, 15h25
  2. [BDE Errors] Erreur d'initialisation
    Par SubZero2 dans le forum Bases de données
    Réponses: 2
    Dernier message: 13/07/2005, 08h46
  3. Erreur d'initialisation du BDE sous Delphi7 ent et WinXP
    Par touhami dans le forum Bases de données
    Réponses: 1
    Dernier message: 15/02/2005, 01h51
  4. [Tomcat MySQL] Erreur d'initialisation d'un pool
    Par mmed dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 05/01/2005, 09h22
  5. Réponses: 2
    Dernier message: 21/06/2004, 15h55

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