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 variable


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2007
    Messages : 301
    Points : 345
    Points
    345
    Par défaut Durée de vie variable
    Bonjour à tous,

    Est-ce que vous pouvez me dire si le code suivant est valide par rapport à la durée de vie de la string renvoyée?
    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
     
    struct Foo
    {
      Foo(char const* s) {
        long len = lstrlen(s);
        this->bstrVal	= ::SysAllocStringLen(NULL, len);
        if(len)
        {
          long rc = MultiByteToWideChar(CP_ACP, 0, s, len, bstrVal, len);
          if(rc!=-1)
            this->bstrVal[rc] = 0;
        }
      }
    private:
      BSTR bstrVal;
    };
     
    std::string bar() {
      std::string result;
      result = "Action";
      return result;
    }
     
    int main() {
      Foo f(bar.c_str());
    }
    J'ai un doute sur le faite que la chaine renvoyée par c_str() soit encore valide lorsque je la manipule dans le constructeur de Foo.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    juin 2010
    Messages
    7 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 7 085
    Points : 32 773
    Points
    32 773
    Billets dans le blog
    4
    Par défaut
    Ce code est tout à fait correct pour un compilateur normal (et pas périmé).
    La string disparait à la fin de la ligne, quand la parenthèse fermante est exécutée. A l'intérieur l'objet temporaire existe.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  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
    Tout pareil, pas de soucis je pense, ça devrait fonctionner même avec ce bon vieux Visual Studio 6.0 qui a 20 ans d'âge

    Et entre parenthèses, puisque j'en vois dans ton code, si tu dois utiliser des BSTR n'hésite pas à passer par l'encapsulation _bstr_t (#include <comdef.h>) qui va te faire tout à la fois du RAII et les conversions ANSI<->UTF16 à la volée.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2005
    Messages
    4 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : février 2005
    Messages : 4 964
    Points : 11 921
    Points
    11 921
    Par défaut
    Manque quand même un "SysFreeString" quelque part pour éviter les fuites mémoire.
    https://msdn.microsoft.com/fr-fr/library/ms891288.aspx

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2007
    Messages : 301
    Points : 345
    Points
    345
    Par défaut
    Merci à tous pour cette confirmation!
    Merci @camboui pour les _bstr_t c'est une bonne idée
    @bacelar je n'avais mis qu'une sous partie la Sysfreestring est bien présent dans le code d'origine (il n'est pas de moi, on est sur la piste d'un bug...) mais je vais sans doute refactorer pour utiliser les _bstr_t proposées par camboui

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    27 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2005
    Messages : 27 346
    Points : 41 438
    Points
    41 438
    Par défaut
    Attention, dans ton code, pour bien faire la taille initiale devrait elle aussi être calculée avec MultiByteToWideChar() (en passant un buffer de sortie nul et de taille zéro) plutôt qu'avec lstrlen().
    Et tu peux envisager de prendre la codepage en paramètre avec CP_ACP comme valeur par défaut.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Durée de vie de variable static
    Par Braillane dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 23/09/2009, 15h55
  2. [C#] Durée de vie variables membre
    Par remitbo dans le forum ASP.NET
    Réponses: 4
    Dernier message: 24/04/2009, 12h32
  3. [PHP 5.2] Comment est gérée la durée de vie des variables ?
    Par Christophe Charron dans le forum Langage
    Réponses: 4
    Dernier message: 27/02/2009, 11h16
  4. Scope et durée de vie des variables
    Par TwoHorned dans le forum Langage
    Réponses: 2
    Dernier message: 30/08/2007, 16h28
  5. Duree de vie des variables
    Par biggione dans le forum Struts 2
    Réponses: 2
    Dernier message: 20/07/2007, 10h12

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