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

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

Linda Hamilton
Libérer: 2024-11-11 11:42:02
original
497 Les gens l'ont consulté

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

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

En C , l'utilisation de std : :string::c_str() sur les chaînes temporaires a été un sujet de préoccupation. Considérez l'extrait de code suivant :

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

std::string random_string_generator();

consumer(random_string_generator().c_str());
Copier après la connexion

Le problème surgit car, lors de l'appel de std::string::c_str() sur l'objet temporaire std::string, la destruction de l'objet string semble imminente.

Cependant, selon la norme C 11, le pointeur récupéré via std::string::c_str() fait référence à la mémoire gérée par l'objet chaîne, et sa validité s'étend jusqu'à :

  • Une fonction membre non constante est invoquée sur l'objet chaîne.
  • L'objet chaîne est détruit.

Dans l'extrait de code fourni , l'objet chaîne temporaire est détruit à la fin de l'expression complète (c'est-à-dire après l'appel à consumer()). Par conséquent, le code est considéré comme sûr, car le pointeur récupéré via std::string::c_str() reste valide tout au long de l'appel à consumer().

La durée de vie des objets temporaires est clairement définie depuis C 98 , contrairement aux versions antérieures de C où cela variait en fonction du compilateur. En conséquence, le code qui était autrefois dangereux dans les versions précédentes est désormais considéré comme sûr avec les compilateurs C modernes.

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal