3 votes

Pointeur vers la chaîne temporaire

Nous avons les fonctions suivantes:

std::wstring f(const std::string& ref){
    return boost::locale::conv::utf_to_utf(s);
}

const f2(LPCWSTR p){
// utilise p
}

Est-il sûr d'appeler:

std::string s = "x";
f2(f(s).c_str());

Mon doute est soulevé par le fait que f(s) renvoie un objet temporaire et que f2 prend un pointeur vers celui-ci.


Dr. Memory indique qu'il s'agit d'un "accès non adressable". Lorsque je le remplace par:

std::string s = "x";
std::wstring s2 = f(s);
f2(s2.c_str());

Dr. Memory ne pointe pas "accès non adressable"

7voto

StoryTeller Points 6139

Tant que f2 ne stocke pas le pointeur pour une utilisation ultérieure, tout est parfaitement correct.

Toute temporaires créées lors de l'évaluation d'une sous-expression existent jusqu'à la fin de l'expression complète dans laquelle elles apparaissent. Ainsi, f(s).c_str() sera un pointeur valide pour la durée de l'appel à f2.

5voto

Sander De Dycker Points 6074

Le temporaire restera valide pendant la durée de l'expression complète f2(f(s).c_str()); - c'est-à-dire que cela inclut l'appel de fonction f2.

Cela suppose que f2 ne stockera pas le pointeur à utiliser après la fin de la fonction.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X