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 :

Passage par référence


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de titoine1978
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2005
    Messages : 132
    Par défaut Passage par référence
    Bonjour,

    A votre avis ce code est-t-il dangereux ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void main()
    {
       string  MyString;
       function(MyString);
    }
     
    function(string& MyString)
    {
       stringstream ss;
       MyString = ss.str();
    }
    J'avais un bug qu'en release, une CMemoryException pas catchée. Le fait d'avoir écrit ce qui suit a résolu le problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    function(string& MyString)
    {
       stringstream ss;
       MyString = ss.str().c_str();
    }
    Merci.

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Voici l'exemple donné dans http://www.cplusplus.com/reference/i...tream/str.html
    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
     
    // stringstream::str
    #include <iostream>
    #include <sstream>
    #include <string>
    using namespace std;
     
    int main () {
     
      stringstream oss;
      string mystr;
     
      oss << "Sample string";
      mystr=oss.str();
     
      cout << mystr;
     
      return 0;
    }
    Et celui par http://www.cppreference.com/cppsstream/str.html
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     ostringstream stream1;
      stream1 << "Testing!" << endl;
      cout << stream1.str();
    Je ne vois pas pourquoi le passage par référence poserais problème. Normalement, l'implémentation sait gérer ce genre de chose.

  3. #3
    Membre confirmé Avatar de titoine1978
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2005
    Messages : 132
    Par défaut
    Je vais essayer d'investiguer plus sur mon bug...comme toi je pense que le passage pas référence dans ce cas précis ne pose pas de problème. Je voulais en être certain.

  4. #4
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Le premier code que tu as posté est ce qui peut se faire de mieux. Il est sûr et efficace (pas de copie ni de conversions inutiles). Le problème doit venir d'ailleurs.

  5. #5
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2
    Par défaut
    D'après ce que je comprends :
    Dans function, tu déclares un stringstream , et tu tentes de récupérer la string associée, mais elle n'existe pas. Tu récupères donc n'importe quoi dans MyString. Tu évite un crash en forçant un caractère de fin à MyString, ce que tu fais avec .c_str().
    Tu devrais regarder du côté du constructeur. Qu'est ce que tu veux faire ?

  6. #6
    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 Nestor Fish Voir le message
    D'après ce que je comprends :
    Dans function, tu déclares un stringstream , et tu tentes de récupérer la string associée, mais elle n'existe pas.

    pourquoi?

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 476
    Par défaut
    Citation Envoyé par titoine1978 Voir le message
    Bonjour,

    A votre avis ce code est-t-il dangereux ?
    Ça ressemble beaucoup à un objet non initialisé. Donc soit ton code est légèrement plus complexe qu'il n'y paraît (threads ?) et ton MyString disparaît dans l'intervalle où tu appelles function, soit l'implémentation de ta bibliothèque standard est buguée.

    Peux-tu nous donner l'état de la pile au moment du plantage ?

    Il faut bien voir que str() et c_str() sont deux choses différentes : le premier renvoie une copie de l'objet string géré par le streambuf associé à l'objet string. Le deuxième renvoie un pointeur vers une chaîne C proprement terminée par un 0.

    On peut très bien imaginer, par exemple, que le fait de devoir renvoyer un pointeur oblige à initialiser la chaîne, qu'elle soit vide ou non. On peut aussi envisager le fait que le string buffer gère son contenu en stockant sa taille dans un entier non signé plutôt qu'en plaçant une sentinelle en fin de chaîne. Ainsi, si la taille est marquée comme étant nulle, il suffit de renvoyer un pointeur vers le premier '\0' en mémoire plutôt que d'initialiser un tampon. Il est donc possible que ton objet-chaîne ait été corrompu par un débordement de tampon, par exemple, et que les effets restent dormants tant que ta chaîne est vide.

    Essaie de revenir à un str() normal et de mettre quelque chose dedans, ou bien poste plus de code.

Discussions similaires

  1. Passage par référence
    Par e1lauren dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 01/09/2006, 12h59
  2. Passage par copie vs passage par référence
    Par bolhrak dans le forum C++
    Réponses: 11
    Dernier message: 20/08/2006, 23h37
  3. Réponses: 4
    Dernier message: 26/12/2005, 17h01
  4. Passage par référence
    Par difficiledetrouver1pseudo dans le forum Langage
    Réponses: 9
    Dernier message: 28/09/2005, 11h17
  5. Problème très rapide de passage par référence
    Par Noxexplorer dans le forum ASP
    Réponses: 2
    Dernier message: 23/06/2005, 10h02

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