Pièges potentiels liés à l'utilisation de std::string::c_str() avec des chaînes temporaires
Considérez l'extrait de code C suivant :
void consumer(char const* p) { std::printf("%s", p); } std::string random_string_generator(); consumer(random_string_generator().c_str());
Ce code pose la question de savoir s'il est bien formé selon le standard C.
Le souci vient du fait que random_string_generator() renvoie un objet std::string temporaire. Nous prenons ensuite le pointeur c_str(), laissant potentiellement l'objet temporaire std::string vulnérable à la destruction avant que le pointeur ne soit utilisé.
Pour comprendre les implications, nous devons nous plonger dans la durée de vie des temporaires en C .
Selon le standard C, la durée de vie d'un temporaire s'étend jusqu'à la fin de l'expression complète dans laquelle il a été créé. Dans ce cas, l’expression complète est l’appel au consommateur. Par conséquent, l'objet temporaire std::string ne sera détruit qu'après la fin de l'exécution de la fonction consommateur.
Ainsi, le pointeur c_str() que nous avons obtenu restera valide tout au long de l'appel au consommateur, ce qui rend notre code bien -formé et sûr à utiliser.
Il est important de noter que cette garantie ne vaut que pour la durée de vie de l'expression complète. Si le pointeur c_str() est stocké et utilisé en dehors de ce contexte, le comportement devient indéfini car l'objet temporaire std::string peut avoir déjà été détruit.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!