Maison > développement back-end > C++ > le corps du texte

## Pourquoi `std::string.c_str()` échoue-t-il lorsqu'il est utilisé sur une fonction renvoyant une chaîne en C ?

Linda Hamilton
Libérer: 2024-10-26 12:30:29
original
671 Les gens l'ont consulté

## Why Does `std::string.c_str()` Fail When Used on a Function Returning a String in 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 :

  • Stockez la chaîne renvoyée dans une variable nommée avant d'extraire une chaîne de style C.
  • Liez la chaîne renvoyée à une référence const lvalue ou rvalue-reference.
  • Utilisez le pointeur de chaîne de style C avant que la chaîne temporaire ne soit détruite.

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!

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!