Maison  >  Article  >  développement back-end  >  Pourquoi l'appel de `c_str()` sur un `std::string` désalloué renvoyé par une fonction semble-t-il fonctionner, mais conduit en fait à un comportement non défini ?

Pourquoi l'appel de `c_str()` sur un `std::string` désalloué renvoyé par une fonction semble-t-il fonctionner, mais conduit en fait à un comportement non défini ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-26 04:16:02929parcourir

Why Does Calling `c_str()` on a Deallocated `std::string` Returned from a Function Seem to Work, But Actually Leads to Undefined Behavior?

Pourquoi renvoyer des littéraux de chaîne C à partir de fonctions std::string et appeler c_str() peut conduire à un comportement non défini

Dans une conférence récente, vous avez peut-être rencontré un fragment de code C qui a suscité une certaine confusion :

<code class="cpp">std::string myFunction() { return "it's me!!"; }

int main() {
  const char* tempString = myFunction().c_str();
  char myNewString[100] = "Who is it?? - ";
  strcat(myNewString, tempString);
  printf("The string: %s", myNewString);
}</code>

Il est compréhensible de supposer que ce code échouerait car "return 'c'est moi !!'" invoque implicitement le constructeur std::string avec un caractère const[]. Par conséquent, le std::string renvoyé par la fonction est immédiatement désalloué au retour de la fonction. Cependant, étonnamment, le code s'exécute sans aucun problème apparent.

Votre analyse du code est exacte. Le comportement présenté ici relève du comportement non défini. Dans de tels cas, les répercussions peuvent varier considérablement. Dans ce cas spécifique, la mémoire allouée à la chaîne, même si elle est techniquement désallouée, conserve toujours ses données d'origine lors de l'accès. Ce phénomène se produit fréquemment parce que les systèmes d'exploitation n'effacent pas automatiquement la mémoire désallouée, choisissant plutôt de la marquer comme disponible pour une utilisation future.

Cependant, il est crucial de noter que la gestion de la désallocation de mémoire n'est pas de la responsabilité du C. langue; c'est un détail complexe spécifique à chaque implémentation de système d'exploitation. D'un point de vue C, le "comportement non défini" fourre-tout s'applique. Par conséquent, il est fortement déconseillé de s'appuyer sur un tel comportement car cela peut conduire à des résultats imprévisibles et potentiellement catastrophiques dans votre 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!

Déclaration:
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