"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Pourquoi le renvoi d'un littéral de chaîne C à partir d'une fonction std::string semble-t-il parfois fonctionner, mais le comportement reste-t-il toujours indéfini ?

Pourquoi le renvoi d'un littéral de chaîne C à partir d'une fonction std::string semble-t-il parfois fonctionner, mais le comportement reste-t-il toujours indéfini ?

Publié le 2024-11-18
Parcourir:918

Why Does Returning a C String Literal from a std::string Function Seem to Work Sometimes, But is Still Undefined Behavior?

Renvoi d'un littéral de chaîne C à partir d'une fonction std::string et appel de c_str()

En C , renvoyer un littéral de chaîne C à partir d'une fonction std::string est un pratique peu judicieuse qui peut conduire à un comportement indéfini. Cependant, une idée fausse courante est que ce code devrait échouer, alors qu'il semble fonctionner dans certains cas.

Quand "c'est moi !!" est transmis à myFunction(), le littéral de chaîne C est implicitement converti en un objet std::string. L'objet std::string renvoyé pointe vers son tampon de caractères interne, qui contient une copie du littéral de chaîne. L'appel de c_str() sur std::string renvoie un pointeur vers ce tampon.

Le problème potentiel survient car le tampon de caractères interne de l'objet std::string n'est pas stocké dans la mémoire statique. Une fois la fonction myFunction() renvoyée, l'objet std::string et son tampon interne sont détruits. Cela signifie que le pointeur obtenu à partir de c_str() devient un pointeur suspendu pointant vers la mémoire désallouée.

Cependant, dans certaines implémentations et dans certaines circonstances, le système d'exploitation peut ne pas récupérer immédiatement la mémoire utilisée par le std::string désalloué. . C'est ce qu'on appelle la persistance de la mémoire. En conséquence, le système d'exploitation autorise par erreur le code à continuer d'accéder à la mémoire désallouée, donnant l'illusion que le code fonctionne correctement.

Il est important de souligner que ce comportement n'est pas défini en C . La norme de langage ne définit pas ce qui se passe dans cette situation, et différentes implémentations peuvent se comporter différemment. S'appuyer sur la persistance de la mémoire est dangereux et peut conduire à des erreurs inattendues dans différents contextes ou sur différents systèmes d'exploitation.

Par conséquent, même si l'exemple de code peut sembler fonctionner dans certains cas, il est toujours considéré comme un comportement indéfini et doit être évité. Pour éviter de tels problèmes, il est recommandé de renvoyer une copie du littéral de chaîne à partir de la fonction std::string plutôt qu'un pointeur direct vers son tampon interne.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3