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 :

Problèmes avec const ?


Sujet :

C++

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut Problèmes avec const ?
    Hello,

    J'ai une fonction de gestion d'exception qui se présente comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    const char *monException::what(void) const
    {
        std::string res;
        (...)
        return res.c_str();
    }
    Elle est appelée par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    catch (const monException &monException)
    {
        const char *zob = monException.what();
    }
    Le problème est que ce que je mets comme chaîne de caractères dans la première fonction est perdu lorsqu'elle retourne son résultat.
    L'adresse est bien la même, mais les octets qui se trouvent derrière semblent réinitialisés...

    Merci pour votre aide.

  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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Tu ne devrais pas utiliser std::string dans ta fonction membre what() ; en effet celle-ci ne doit pas pouvoir lever d'exception (ce que peut faire ton code utilisant std::string). D'ailleurs un compilo bien paramétré t'indiquerait que ton prototype de fonction ne correspond pas à celui de la classe mère, il devrait être le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char *monException::what(void) const throw()
    De même pour le destructeur, d'ailleurs.

    Bon ça c'est pour la théorie, en pratique si ta fonction what ne lève pas d'exception (ce qui devrait être le cas la plupart du temps quand même) ça devrait fonctionner.

    Ton problème pourrait venir du fait que tu stockes le résultat de what(), qui est lui-même le résultat d'un c_str(), pour le réutiliser plus tard. Or c_str() renvoie une chaîne potentiellement temporaire, càd qui n'existe plus après l'appel.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Hello,

    1. Pourquoi ma fonction what() ne devrait-elle pas pouvoir lever d'exception ?

    2. Pourquoi le fait d'utiliser std::string est-il susceptible de lever une exception ? (j'en ai besoin, car je dis concaténer des chaînes de caractères)

    3; Ce que me renvoie mon what() n'est normalement pas stocké. C'est utilisé comme paramètre du constructeur d'une classe. Et le résultat semble être identique.

  4. #4
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    1. Parce qu'elle est définie comme ça dans la classe std::exception (cf. "throw()"). Il paraît logique qu'une fonction appelée après réception d'une exception n'ait elle-même pas le droit d'en lever une nouvelle.

    2. Un exemple tout simple : lors de tes concaténations tu dois allouer un nouvel espace mémoire, ce qui peut lever un std::bad_alloc en cas d'échec.

    3. Ah... Dans ce cas, je sèche.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Merci pour les infos, en effet pleines de sens. :-)

    Dommage que mon problème prinicpal ne soit toutefois pas résolu. :-|

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Tu retournes un pointeur sur quelque chose alloué sur la pile et donc plus valide à la sortie de what()...

    edit : et donc il peut se passer potentiellement n'importe quoi, essaye de mettre 'res' en static pour voir ?


    MAT.

  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
    Citation Envoyé par oodini
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    const char *monException::what(void) const
    {
        std::string res;
        (...)
        return res.c_str();
    }
    Ce n'est pas correct car l'objet res est détruit avant de sortir de la fonction, donc la valeur de res.c_str() ne peut pas être utilisée en dehors de la fonction.

    Une solution est par exemple de définir res comme membre de la classe.

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Effectivement !

    Merci beaucoup pour ce coup de pouce !

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Ca semblait une bonne idée, mais en fait, je ne peux pas modifier une donnée membre, puisue ma fonction est const. Et je suis obligé de la définir comme telle puisque je l'hérite de la classe exception.... :-/

  10. #10
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Pourquoi construis-tu ton message dans what() et non dans le constructeur ?

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Hmmm...

    C'est une piste intéressante. Je m'en vais essayer.

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    OK, j'ai réussi !

    Merci !

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

Discussions similaires

  1. Problèmes de classe avec const
    Par Invité4 dans le forum C++
    Réponses: 3
    Dernier message: 09/04/2009, 00h41
  2. Problème avec fonction const
    Par oodini dans le forum SL & STL
    Réponses: 2
    Dernier message: 26/11/2008, 16h24
  3. Réponses: 17
    Dernier message: 03/06/2008, 13h19
  4. problème avec const correctness
    Par donkeyquote dans le forum C++
    Réponses: 5
    Dernier message: 12/10/2007, 01h55
  5. problème avec const char * et #define macro
    Par CodeurNé dans le forum C
    Réponses: 5
    Dernier message: 20/09/2006, 21h25

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