const char *Greet(const char *c) {
string name;
if(c)
name = c;
if (name.empty())
return "Hello, Unknown";
return name.c_str();
}
int _tmain(int argc, _TCHAR* argv[])
{
cout << Greet(0) << '\t' << Greet("Hello, World") << endl;
return 0;
}
Je vois 2 bogues avec le code ci-dessus.Retour d'une fonction
Renvoyer c_str d'un objet chaîne défini localement pour la fonction. La chaîne est détruite lorsque la fonction retourne et c_str() pointe clairement vers une mémoire qui est désaffectée.
Retour "Bonjour, Inconnu" à partir de la fonction. C'est encore un tableau de const consts alloués dans la pile qui devrait être désaffecté aussi bien quand la fonction retourne. Cependant, ce n'est pas le cas et je suppose que c'est à cause de l'optimisation de la valeur de retour.
Est-ce que ma compréhension ci-dessus est correcte? PS: J'ai testé le code ci-dessus avec gcc et MSVC10. GCC exécute le code ci-dessus correctement et ne génère aucune erreur d'exécution ou comportement non défini à la fois pour l'objet chaîne et pour la chaîne constante. MSVC10 affiche des données parasites pour l'objet chaîne mais imprime correctement la chaîne constante.
Eh bien, techniquement, le comportement de GCC pour 'Greet (" Hello, World ")' _is_ undefined – AlcubierreDrive