Maison > développement back-end > C++ > Pourquoi `c_str()` d'une chaîne temporaire C reste-t-il valide après l'appel de fonction ?

Pourquoi `c_str()` d'une chaîne temporaire C reste-t-il valide après l'appel de fonction ?

Mary-Kate Olsen
Libérer: 2024-12-16 18:57:21
original
182 Les gens l'ont consulté

Why Does a C   Temporary String's `c_str()` Remain Valid After the Function Call?

La durée de vie des objets temporaires revisitée

L'extrait de code fourni présente le comportement intrigant des objets temporaires en C . Considérez ce qui suit :

std::string foo() {
  std::string out = something...;
  return out;
}

void bar(const char* ccp) {
  // Do something with the string...
}

bar(foo().c_str());
Copier après la connexion

La question se pose : pourquoi le pointeur "c_str()" du temporaire renvoyé par foo() est-il toujours valide ? Le bon sens pourrait suggérer que le temporaire soit détruit avant l'appel de bar(). Cependant, ce n'est pas le cas.

Selon la norme C, la durée de vie d'un objet temporaire s'étend jusqu'à ce que l'évaluation de l'expression complète qui contient lexicalement la valeur r qui l'a créé soit terminée. Cela signifie que dans le code donné, l'objet temporaire renvoyé par foo() restera vivant jusqu'à ce que l'appel à bar() soit terminé.

Pour visualiser ce concept, considérez ce qui suit :

____________________   full-expression ranges from 'b' to last ')'
bar(foo().c_str());
     ^^^^^          ^
       |            |
     birth       funeral
Copier après la connexion

L'objet temporaire est créé lorsque foo() est appelé (noté "naissance"). Il reste vivant tout au long de l'évaluation de l'expression complète, qui dans ce cas est l'appel de fonction bar(foo().c_str()). Une fois l'appel de fonction terminé, l'objet temporaire est détruit (noté « funérailles »).

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!

source:php.cn
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