Préserver l'intégrité des chaînes temporaires : explorer std::string::c_str()
Dans le domaine du C , la sécurité et la validité du code impliquant des chaînes temporaires soulève souvent des inquiétudes. L'une de ces questions concerne l'utilisation de std::string::c_str() dans le contexte de chaînes temporaires.
La question :
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());
Le dilemme vient de la destruction potentielle de l'objet temporaire std::string après avoir récupéré son c_str() pointeur. Cela pose-t-il un problème de validité selon la norme C ?
La réponse :
Comprendre la durée de vie des temporaires est crucial. En C , les temporaires sont détruits à la fin de l'expression complète, pas immédiatement après leur création ni avant leur utilisation. Par conséquent, dans le code donné, l'objet temporaire std::string persistera jusqu'à la conclusion de l'appel de fonction à consumer().
Le pointeur obtenu via std::string::c_str() reste valide jusqu'à toute opération non const est effectuée sur l'objet chaîne ou il est détruit. Puisque l'objet chaîne est temporaire et détruit à la fin de l'expression complète, le code est effectivement bien formé et valide.
Note de bas de page historique :
Il est important de notez que le comportement décrit ci-dessus est devenu standardisé avec C 98. Avant cela, la durée de vie des temporaires variait en fonction de l'implémentation du compilateur. Cependant, à mesure que la norme a évolué, le comportement a été défini de manière uniforme, garantissant ainsi la cohérence entre les 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!