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!