Durée de vie de std::string::c_str() Résultat
Question :
Dans un programme interfacé avec du code existant qui utilise des pointeurs const char, un développeur interroge sur la durée de vie de Résultats std::string::c_str(). Ils demandent spécifiquement si l'extrait de code suivant est sûr :
{ std::string server = "my_server"; std::string name = "my_name"; Foo foo; foo.server = server.c_str(); foo.name = name.c_str(); // use Foo // Foo about to be destroyed (before name and server) }
Réponse :
La durée de vie des résultats std::string::c_str() dépend du la durée de vie de la chaîne et toutes les modifications ultérieures. Le résultat devient invalide si la chaîne est modifiée ou détruite. Par conséquent, il est généralement recommandé de faire une copie du résultat lorsque l'on envisage de le stocker pour une utilisation future.
Dans l'extrait de code fourni, les std::strings (serveur et nom) sont créés et modifiés dans le cadre de le bloc de code. Les résultats c_str() (foo.server et foo.name) pointent vers ces std::strings temporaires, qui sont détruites à la fin de la portée.
Cependant, les chaînes ne sont pas utilisées en dehors de la portée. , ce qui rend techniquement sûr la poursuite de l'utilisation des pointeurs const char dans use_foo() et ~Foo(). Cependant, si ces fonctions copient potentiellement les pointeurs vers d'autres emplacements, de véritables copies doivent être effectuées au lieu de simplement copier les pointeurs.
Par conséquent, même si l'extrait de code démontre un comportement techniquement correct dans ce cas spécifique, de bonnes pratiques de codage seraient impliquent de faire des copies des résultats c_str() s'ils doivent être stockés pour une utilisation ultérieure.
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!