1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
#include <string>
using namespace std;
string f1()
{
string s("f1"); // Variable automatique détruite à la fin de la fonction
return s; // C'est une copie qui est renvoyée, la variable elle même est détruite
}
string& f2()
{
string s("f2"); // Variable automatique détruite à la fin de la fonction
return s; // Un excellent moyen de se faire beaucoup de mal, puisqu'on renvoie une référence sur une variable qui n'existera plus
// Note : VS fait un warning
}
string* f3()
{
string* s = new string("f3"); // Une variable dynamique, qui survivra à sa fonction créatrice
return s; // On renvoie l'adresse
}
int main()
{
string str("main"); // Variable automatique détruite à la fin du main
{
string str2("bloc"); // variable automatique, détruite à la fin du bloc
}
if(1 == 1)
{
string str2("if"); // variable automatique, détruite à la fin du if
}
string * pstr = 0; // Toujours initialiser à null
str = f1(); // Tout va bien
str = "change1"; // Idem
str = f2(); // Devrait marcher, copie de la variable renvoyée, avant sa destruction
str = "change2"; // Tout va bien
pstr = &f1(); // Attention les dégâts, récupération de la copie temporaire
(*pstr) = "change3"; // Vous êtes mort
pstr = &f2(); // Attention les dégâts, récupération d'une variable en sursis
(*pstr) = "change4"; // Badaboom
pstr = f3(); // Ok!
(*pstr) = "change4"; // Toujours bon
delete pstr; // Ne pas oublier !!
return 0;
} |
Partager