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'un type de retour (avec une référence)


Sujet :

C++

  1. #1
    Membre confirmé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Points : 546
    Points
    546
    Par défaut Durée de vie d'un type de retour (avec une référence)
    Bonjour,
    je m'interroge sur la durée de vie d'un objet retourné par une fonction. Celui-ci peut apparemment "survivre" plus ou moins longtemps
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::ostringstream oss;
    [...]
    ApiQuiVeutDesChar( oss.str().c_str() )
    // ici la string temporaire renvoyée par ostringstream::str() n'est détruite qu'après le retour 
    // de ApiQuiVeutDesChar (heureusement sinon la chaine renvoyée par c_str() ne serait plus valide)
    Mais dans ce cas suivant, l'objet temporaire n'est détruit qu'à la fin du bloc
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    class TestDest
    {
    private:
     
    public:
       int m_i;   
     
       TestDest(int i = 0):m_i(i)
       {   cout << "TestDest::TestDest()" << endl ;  }
     
       TestDest(const TestDest &)
       {   cout << "TestDest::TestDest(const TestDest &)" << endl ;  } 
     
       TestDest & operator = (const TestDest &)
       {
    	   cout << "TestDest::operator = (const TestDest &)" << endl ;
    	   return *this;
       }
     
       ~TestDest()
       {   cout << "TestDest::~TestDest()" << endl ;  }
    };
    [...]
    TestDest  function()
    {
        return TestDest();
    }
    [...]
    {
      TestDest & t = function();
      cout << "Hello" << endl;
    }
    Resultat (VC++ 2005)
    TestDest::TestDest()
    Hello
    TestDest::~TestDest()
    En fait, c'est ce que je cherchais à faire (expérimentations ), mais est-ce bien dans la norme ? (ou comportement indéfini ?)

  2. #2
    screetch
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    std::string doTest()
    {
    	return std::string("test");
    }
     
    int main(int arcg, char *argv[])
    {
    	const char *text = doTest().c_str();
    	printf("%s\n", text);
    	return EXIT_SUCCESS;
    }
    ceci echoue. c'est peut etre de ca dont tu parlais.

    prendre une reference sur une valeur de retour etend la durée de vie de la valeur de retour, jusqu'a la destruction de la référence. j'ai deja vu une discussion la dessus sur l'optimisation, ou les gens disaient qu'il faut toujours prendre des refs car ca va plus vite. je fais un coup de recherche et je reviens.

  3. #3
    screetch
    Invité(e)
    Par défaut
    http://www.developpez.net/forums/sho...E9rence&page=3

    je vois en ointillé la meme discussion, pas de reponse definitive je crois. c'est entrecoupé de posts sur le sujet original ^^

  4. #4
    Membre confirmé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Points : 546
    Points
    546
    Par défaut
    En effet les post #7, #14 et #23 en parle. Et comme il est dit dans ces post ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    {
       TestDest t = function();
       cout << "Hello" << endl;
    }
    produit le même effet (le compilateur effectue une optimisation en ne faisant pas la copie). J'aurais espéré que la version avec référence ( TestDest & t = function(); ) fonctionne même lorsque le constructeur par recopie n'est pas disponible, mais ce n'est pas le cas. Dommage . => Résolu

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

Discussions similaires

  1. Type de retour d'une fonction PL/PGSQL
    Par the java lover dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 21/01/2009, 11h13
  2. [PL/SQL] type de retour d'une fonction
    Par foffffa dans le forum SQL
    Réponses: 4
    Dernier message: 27/03/2008, 15h06
  3. Réponses: 19
    Dernier message: 12/12/2007, 15h00
  4. [Oracle 9.1] Types de retour d'une fonction PL/SQL
    Par ftrifiro dans le forum PL/SQL
    Réponses: 8
    Dernier message: 12/10/2005, 16h54
  5. [type de retour dans une proc]
    Par viny dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 19/03/2005, 14h35

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