Maison >développement back-end >C++ >## Pourquoi `std::string.c_str()` échoue-t-il lorsqu'il est utilisé sur une fonction renvoyant une chaîne en C ?
Comprendre pourquoi std::string.c_str() sur une fonction renvoyant une chaîne échoue
En C, lorsqu'une fonction renvoie une chaîne , il le fait en valeur. Cela signifie que la chaîne renvoyée est une copie de la chaîne d'origine, plutôt qu'une référence à celle-ci. Ceci est différent du comportement des autres types intégrés, tels que les entiers ou les flottants, qui sont renvoyés par référence par défaut.
Dans votre exemple, la fonction getString() renvoie un objet chaîne qui est une copie de la chaîne "bonjour". Cette copie est stockée dans un emplacement temporaire en mémoire. La ligne const char* cStr = getString().c_str(); tente d'obtenir une chaîne de style C représentant la chaîne renvoyée. Cependant, comme la chaîne temporaire a déjà été détruite, le pointeur cStr pointe désormais vers une mémoire invalide.
La destruction des objets temporaires
L'explication de ce comportement réside dans les règles pour les objets temporaires en C . Un objet temporaire est un objet créé implicitement par le compilateur pour éviter toute copie inutile. Dans votre cas, la chaîne temporaire créée par getString() est un objet temporaire.
Les objets temporaires sont détruits à la fin de l'expression complète dans laquelle ils sont créés. Une expression complète est une expression qui n’est pas une sous-expression d’une autre expression. Dans votre exemple, la ligne const char* cStr = getString().c_str(); est une expression complète. Par conséquent, la chaîne temporaire créée par getString() est détruite à la fin de cette ligne.
Prévenir le problème
Pour éviter ce problème, vous disposez de plusieurs options :
En suivant ces directives, vous pouvez éviter les problèmes associés aux pointeurs suspendus et vous assurer que votre code se comporte correctement.
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!