Maison  >  Article  >  développement back-end  >  Est-il sûr d'utiliser `std::string::c_str()` avec des chaînes temporaires en C ?

Est-il sûr d'utiliser `std::string::c_str()` avec des chaînes temporaires en C ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-06 17:51:02814parcourir

Is it Safe to Use `std::string::c_str()` with Temporary Strings in C  ?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn