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

MFC Discussion :

[STL] vector<string> et appel de fonctions.


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 88
    Par défaut [STL] vector<string> et appel de fonctions.
    Bonjour.

    Je suis un peu perplexe devant ce problème :
    J'ai un objet qui possède un vecteur de string.
    Cet objet possède une fonction qui permet de récupérer une de ces chaines de façon personnalisée. J'utilise donc un ostringstream pour pouvoir rajouter du texte mis en forme (conversion de nombre, alignement,...) à cette chaine. Je renvoie la chaine et, lorsque je sors de la fonction mon code plante car il n'arrive plus à désallouer cette chaine.
    Et là, je vois plus trop ce qu'il faut que je fasse.
    En gros, voici mon code :

    A.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class A
    {
     
        vector<string> strtab;
        string func(Obj o);
    }
    B.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class B
    {
        A link;
        void foo();
    }
    A.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    A::A()
    {
       strtab.push_back("chaine 1");
       strtab.push_back("chaine 2");
       strtab.push_back("chaine 3");
       //...
    }
     
    string A::func(Obj o)
    {
        ostringstream ret;
        ret << "[E" << o.id << "] "<< strtab[o.id];
        return ret.str();
    }
    B.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void B::foo()
    {
       Obj o;
       o.id = 1;
       string str = link.func(o);
    }
    Et donc le problème survient quand je sors de B::foo, lorsqu'il faut désallouer str. Si quelqu'un à une idée, ce serait vraiment bien car là, je ne vois même pas où chercher...

    Pour info, j'utilise MS VC++ 6.0.

    D'avance, merci.
    Joe.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    A priori tout est correct. Que dit le message d'erreur exactement ? Et la pile d'appel de fonctions ? Est-ce que o.id est bien inférieur à la taille de ton vector ?
    Sinon essaye d'écrire un code minimal mais qui reproduise le problème, en général on finit toujours par trouver l'erreur de cette manière.

  3. #3
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 292
    Par défaut
    Obj gère-t-il des ressources ?
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 88
    Par défaut
    Hum, le mesage d'erreur j'en ai pas ca pourrait être quelque chose du genre "la mémoire ne peut être read..."
    la pile d'appel, je l'ai pas sous la main, mais c'est quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ...
    std::basic_string::qqch2()
    std::basic_string::qqch1()
    std::basic_string::basic_string~()
    B::foo()
    o.id a pas de problème, j'aurais un clach bien avant.
    Je ne peux pas vraiment écrire de code minimal, il y a un peu trop d'interactions.
    Mais je crois que mon problème se situe au niveau des settings de compilation (quel croute ce truc !) : j'aimerai pouvoir comprendre comment marchent les .pch parce que en activant les settings pr défaut sur mon projet, il arrive pas à le construire ...
    Si tu penses que ce code est juste (et que la manière de faire est ok) mon problème doit effectivement se situer à ce niveau. Je vais encore faire quelques tests avec ces *#$@ de MFC...

    En tout cas merci, ça me rassure.
    Joe.


    [Edit] Luc : non, Obj n'est rien d'autre qu'une structure, dont voici la déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct AnalyserError
    {
    	unsigned int	id,		///< identifiant de l'erreur (contient le code d'erreur).
    						line;	///< contient le N° de la ligne à laquelle s'est produite l'erreur ou -1 si on ne peut déterminer cette ligne.
    	string msg;				///< contient un texte "personalisant" le descriptif de l'erreur.
    };
    [/edit]

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 88
    Par défaut
    Pour info :
    - Call Stack :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    NTDLL! 784613b1()
    NTDLL! 78496972()
    NTDLL! 7846be26()
    KERNEL32! 77e77345()
    _CrtIsValidHeapPointer(const void * 0x007c58f8) line 1697
    _free_dbg_lk(void * 0x007c58f8, int 0x00000001) line 1044 + 9 bytes
    _free_dbg(void * 0x007c58f8, int 0x00000001) line 1001 + 13 bytes
    free(void * 0x007c58f8) line 956 + 11 bytes
    operator delete(void * 0x007c58f8) line 7 + 10 bytes
    std::allocator<char>::deallocate(void * 0x007c58f8, unsigned int 0x00000021) line 64 + 16 bytes
    std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Tidy(unsigned char 0x01) line 592
    std::basic_string<char,std::char_traits<char>,std::allocator<char> >::~basic_string<char,std::char_traits<char>,std::allocator<char> >() line 59 + 17 bytes
    CEditViewOutput::DisplayError() line 242 + 27 bytes
    (le code est stoppé à la hauteur de l'accolade dans CEditViewOutput:isplayError())
    - Le message d'erreur est "User breakpoint called from code at 0x..." donc sans intérêt (c'est juste pour prévenir un clash, qui arrive dans mon cas, dans la gestion mémoire, en général...)

Discussions similaires

  1. Probleme avec la STL(vector) avec code C
    Par Benjy dans le forum SL & STL
    Réponses: 12
    Dernier message: 06/04/2006, 12h54
  2. Probleme avec parcours de stl::vector
    Par MDiabolo dans le forum SL & STL
    Réponses: 10
    Dernier message: 08/03/2006, 00h35
  3. STL vector addition
    Par dj.motte dans le forum SL & STL
    Réponses: 1
    Dernier message: 08/11/2004, 08h25
  4. appeler une fonction connaissant son nom (en string)
    Par Guigui_ dans le forum Général Python
    Réponses: 1
    Dernier message: 20/07/2004, 00h46
  5. STL::vector crash a l"execution
    Par sebA dans le forum MFC
    Réponses: 2
    Dernier message: 16/06/2004, 16h36

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