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 :

Durée de vie d'une référence


Sujet :

C++

  1. #1
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut Durée de vie d'une référence
    Voici un exemple de code assez explicite:
    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
    template <typename T>
    struct MyStruct
    {
     T const & m_t;
     MyStruct(T const & t):m_t(t) {}
    };
     
     
    main()
    {
     MyStruct<int> msi(5);// création d'un "temporaire" int(i) ?
     ...
     //quelle est la durée de vie de la référence msi.m_t ?
     std::cout << msi.m_t << std::endl;
     ...
    }
    La réponse est sans doute élémentaire, mais voilà que je ne sais plus...
    Merci.

  2. #2
    screetch
    Invité(e)
    Par défaut
    la durée de vie de la référence est la même que la durée de vie de l'objet (donc, le scope)
    la durée de vie de l'objet va de la declaration jusqu'a l'accolade fermante suivante
    la durée de vie de 5 est la durée de vie du programme (c'est une constante, initalisée avant main et detruite apres main)

  3. #3
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Et si je remplace main comme ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    main()
    {
     MyStruct<std::string> msi(std::string("5"));// création d'un "temporaire" ?
     ...
     //quelle est la durée de vie de la référence msi.m_t ?
     std::cout << msi.m_t.c_str() << std::endl;
     ...
    }
    EDIT: je me réponds à moi-même: c'est la cata !

    std::string("5") est un temporaire qui est aussitôt détruit après la création de msi. L'usage de msi.m_t dans le std::cout est interdit !

  4. #4
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par camboui Voir le message
    Voici un exemple de code assez explicite:
    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
    template <typename T>
    struct MyStruct
    {
     T const & m_t;
     MyStruct(T const & t):m_t(t) {}
    };
     
     
    main()
    {
     MyStruct<int> msi(5);// création d'un "temporaire" int(i) ?
     ...
     //quelle est la durée de vie de la référence msi.m_t ?
     std::cout << msi.m_t << std::endl;
     ...
    }
    La réponse est sans doute élémentaire, mais voilà que je ne sais plus...
    Merci.
    Le temporaire vit jusqu'à la fin de l'expression -- donc utiliser la référence après l'exécution du constructeur est inavisé.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  5. #5
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Plus généralement, je pense que c'est le template MyStruct qui souffre d'un défaut de conception et/ou de documentation. Pour plus de robustesse MyStruct.m_t devrait être une valeur et non une référence, mais les performances pourraient s'en ressentir.

  6. #6
    screetch
    Invité(e)
    Par défaut
    hmmm je ne suis pas certain de ca
    enfin une référence c'est comme un pointeur; et si on avait mis un pointeur a la place de la référence, c'aurait été le même problème. et personne n'aurait crié au scandale...

  7. #7
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Donc si la conception est bonne, alors la documentation doit être claire. On est d'accord là-dessus je suppose.
    La documentation doit toujours être claire de toutes façons

  8. #8
    screetch
    Invité(e)
    Par défaut
    hmmm
    selon moi c'est mieux d'interdire (grace au compilateur) ce qui peut planter plutot que de mettre des commentaires ou une ligne en rouge dans une doc de 200 pages "attention, ne pas faire ca!!!"

    restreindre pour interdire la mauvaise utilisation

  9. #9
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par screetch Voir le message
    hmmm je ne suis pas certain de ca
    enfin une référence c'est comme un pointeur; et si on avait mis un pointeur a la place de la référence, c'aurait été le même problème. et personne n'aurait crié au scandale...
    Comme je l'ai écris par ailleurs, le choix entre référence et pointeur est essentiellement une affaire de convention. Passer à une référence un objet dont la durée de vie n'est pas garantie être celle de la fonction (ou de l'objet construit dans le cas d'un constructeur) est contraire aux miennes. Avec un pointeur non intelligent, je m'attends à devoir chercher ce genre de renseignement, avec une référence, non.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

Discussions similaires

  1. Durée de vie d'une session
    Par khokho dans le forum Tomcat et TomEE
    Réponses: 4
    Dernier message: 28/06/2006, 21h31
  2. durée de vie d'une instruction
    Par poporiding dans le forum C++
    Réponses: 6
    Dernier message: 08/06/2006, 16h11
  3. Réponses: 3
    Dernier message: 27/04/2006, 11h37
  4. Durée de vie d'une session
    Par dbass dans le forum Langage
    Réponses: 8
    Dernier message: 21/03/2006, 19h38
  5. [AS2] durée de vie d'une classe (extends movieclip)
    Par ooyeah dans le forum ActionScript 1 & ActionScript 2
    Réponses: 4
    Dernier message: 23/07/2005, 13h33

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