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