Pourquoi l'appel de std::string.c_str() sur une fonction renvoyant une chaîne échoue
Considérez le code suivant :
<code class="cpp">std::string getString() { std::string str("hello"); return str; } int main() { const char* cStr = getString().c_str(); std::cout << cStr << std::endl; // Outputs garbage }</code>
Intuitivement, on pourrait s'attendre à ce que la chaîne temporaire renvoyée par getString() reste valide dans la portée de main(). Cependant, c'est incorrect.
Le problème réside dans la durée de vie des objets temporaires en C . Un objet temporaire est détruit à la fin de l'expression dans laquelle il est créé, sauf s'il est lié à une référence ou utilisé pour initialiser un objet nommé. Dans ce cas, getString() renvoie une chaîne temporaire, qui est détruite à la fin de l'expression dans main().
Par conséquent, cStr contient un pointeur suspendu et son utilisation peut conduire à un comportement indéfini. Pour éviter ce problème, on peut utiliser une variable nommée ou une référence pour garantir la validité de la chaîne renvoyée. Par exemple :
<code class="cpp">std::string returnedString = getString(); const char* cStr = returnedString.c_str(); std::cout << cStr << std::endl; // Safe</code>
Alternativement, la chaîne temporaire peut être utilisée directement sans l'attribuer à une variable :
<code class="cpp">std::cout << getString().c_str() << std::endl; // Also safe</code>
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!