65 votes

std::string::c_str() et temporaires

Le code C++ suivant est-il bien formé :

 void consumer(char const* p)
{
  std::printf("%s", p);
}

std::string random_string_generator()
{
  // returns a random std::string object
}

consumer(random_string_generator().c_str());

Le problème que j'ai avec cela est qu'après avoir créé l'objet std::string temporaire et pris le pointeur c_str(), rien n'empêche l'objet std::string d'être détruit (ou peut-être que je me trompe ?). Pouvez-vous s'il vous plaît m'indiquer la norme, si le code est OK malgré tout. Cela fonctionne, quand je teste avec g++.

23voto

Jon Points 194296

La durée de vie temporaire de std::string s'étend juste au-delà du point où consumer renvoie, il est donc sûr d'utiliser n'importe quoi sur cette chaîne directement à partir de consumer . Ce qui ne va pas, c'est de stocker la valeur que c_str et d'essayer de l'utiliser plus tard (le temporaire aura été détruit, et on ne peut que deviner ce que vous trouverez à l'autre extrémité du pointeur).

5voto

dgu Points 59

Le temporaire renvoyé par la fonction random_string_generator() peut être utilisé dans la fonction consumer() en toute sécurité.

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