Maison > développement back-end > C++ > 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 ?

Barbara Streisand
Libérer: 2024-10-29 09:04:02
original
1034 Les gens l'ont consulté

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 la chaîne std::string désallouée. . 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 non dé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.

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