Maison >développement back-end >C++ >Est-il sûr d'accéder au `c_str()` d'un objet `std::string` temporaire ?

Est-il sûr d'accéder au `c_str()` d'un objet `std::string` temporaire ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-06 19:10:03278parcourir

Is It Safe to Access the `c_str()` of a Temporary `std::string` Object?

Est-il sécuritaire d'accéder au c_str() d'une chaîne temporaire ?

Dans un programme C, le code suivant soulève un problème :

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

std::string random_string_generator();

consumer(random_string_generator().c_str());

On prétend que l'objet temporaire std::string généré par random_string_generator peut être détruit avant l'appel au consommateur, rendant potentiellement le pointeur c_str() invalide. Cependant, il est crucial de comprendre la définition standard de la durée de vie permanente.

Selon la norme C, le pointeur renvoyé par std::string::c_str() reste valide jusqu'à ce qu'une fonction non const soit invoquée. sur l'objet std::string ou il est détruit. Dans le code donné, l'objet temporaire std::string sera détruit à la fin de l'expression complète, qui inclut l'appel au consommateur. Cela confirme que le code est bien formé.

Tant que le consommateur ne tente pas de conserver le pointeur c_str() pour une utilisation ultérieure, il est prudent de supposer que l'objet temporaire std::string ne sera pas détruit prématurément. La durée de vie des temporaires a été définie avec précision depuis C 98, garantissant que du code tel que celui présenté s'exécutera en toute sécurité sur différents compilateurs.

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