Lors d'un récent cours à l'université, notre professeur nous a expliqué les différentes choses auxquelles il faut faire attention lorsqu'on programme dans différents langages. Voici un exemple en C++ :
std::string myFunction()
{
return "it's me!!";
}
int main(int argc, const char * argv[])
{
const char* tempString = myFunction().c_str();
char myNewString[100] = "Who is it?? - ";
strcat(myNewString, tempString);
printf("The string: %s", myNewString);
return 0;
}
L'idée de l'échec est la suivante return "it's me!!"
appelle implicitement le constructeur std::string avec un char[]. Cette chaîne est renvoyée par la fonction et la fonction c_str()
renvoie un pointeur sur les données de la std::string
.
Comme la chaîne renvoyée par la fonction n'est référencée nulle part, elle doit être désallouée immédiatement. Telle était la théorie.
Cependant, l'exécution de ce code fonctionne sans problème. Je serais curieux de savoir ce que vous en pensez. Merci de votre compréhension.
23 votes
Il ne fonctionne pas "sans problème", il ne fait que fait semblant de travailler. Il s'agit d'un comportement non défini, donc tout peut arriver.
4 votes
La mémoire est allouée différemment, mais cette réponse reste valable : stackoverflow.com/a/6445794/13005
0 votes
@SteveJessop +1, je cherchais justement le même lien pour le poster ici.
1 votes
@MarounMaroun C'est une longue histoire :D Cela fait référence à l'acide carbonique dans l'eau gazeuse, et c'est lié aux siphons. (La première fois que j'ai utilisé ce nom, c'était pour le blog hongrois le plus populaire sur l'iPhone, Szifon, dont la prononciation ressemble à celle d'"iPhone", c'est donc une sorte de jeu de mots).
4 votes
Pour obtenir des points bonus, demandez à votre professeur pourquoi il n'a pas écrit
strcat(myNewString, yFunction().c_str());
au lieu de cela. (Astuce : l'objet temporaire vit jusqu'à la fin de l'expression complète, donc bien que cette type de a la même apparence, est bien définie à 100 %).