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

  1. #1
    Membre régulier 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
    Points : 90
    Points
    90
    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
    Points : 13 017
    Points
    13 017
    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 régulier 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
    Points : 90
    Points
    90
    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é
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    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.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  5. #5
    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
    Points : 2
    Points
    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 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    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
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Vraisemblablement, son problème était ailleurs. Et comme l'a dit r0d, son premier code était encore le meilleur. Qu'il déclare pour illustrer son problème une stringstream et n'y ajoute pas de données ne fera qu'avoir une chaîne de caractère vide et ne génère aucun problème.

  8. #8
    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
    Points : 2
    Points
    2
    Par défaut
    Mea culpa, j'ai foncé tête baissée.
    Qu'il déclare pour illustrer son problème une stringstream et n'y ajoute pas de données ne fera qu'avoir une chaîne de caractère vide et ne génère aucun problème.
    Tout y est.

  9. #9
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 370
    Points : 23 625
    Points
    23 625
    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