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 59 60 61 62 63 64 65 66 67
| struct Bidule {
int a;
int *p;
Bidule(int valeur) : a(valeur), p(&a) {}
Bidule(int *p) : a(*p), p(p) {}
~Bidule() {cout << "aie" <<endl;}
//comme tu le vois, p n'est pas possédé par Bidule. C'est à l'utilisateur de s'occuper d'un éventuel delete.
};
int main {
{
Bidule premier(2);
premier.a = 3; //premier.a est une partie de premier, qui est défini dans la pile
cout << *(premier.p) << endl; //affiche 3, car premier.p est l'adresse du a de premier.
/* Ce p est une partie de premier. il est dans la pile, comme premier.
ce 3 est aussi dans la pile, car c'est le a de premier.
*/
} //ici, premier est relaché, puisqu'il sort de la pile.
//ca affiche donc "aie"
{
int entier = 2;
Bidule deuxieme(&entier);
deuxieme.a = 3; //deuxieme.a est une partie de deuxieme, qui est défini dans la pile
cout << *(deuxieme.p) << endl; //affiche 2, car deuxieme.p est l'adresse de entier.
/* Ce p est une partie de deuxieme. il est dans la pile, comme deuxieme.
ce 3 est aussi dans la pile, car c'est entier.
*/
} //ici, entier et deuxieme sont relachés
//ca affiche donc "aie"
{
Bidule troisieme(new int(2));//très très vilain
// ce 2 est dans le tas.
*(troisieme.p) = 3;
cout << troisieme.a << endl; //affiche 2, car troisieme.a a été initialisé avec une copie de ce que pointait p lors de la construction.
troisieme.a = 4;
cout << *(troisieme.p) << endl; //affiche 3, car troisieme.p est l'adresse du "new int", pas de troisieme.a.
delete troisieme.p;//très très sale, mais nécessaire.
} // ici, seul troisieme est relaché. C'est pour ca qu'il a fallu faire le delete
//ca affiche donc "aie"
{
Bidule *quatrieme = new Bidule(new int(2));
//voici deux blocs mémoire dans le tas: l'entier et le Bidule
int* pointeur = quatrieme->p;
//pointeur est dans la pile. il contient l'adresse contenu dans le p du bidule pointé par quatrieme.
*pointeur = 7; //*pointeur est donc dans le tas.
delete quatrieme; //ce qui affiche aie
delete pointeur;//parce que j'ai pris la précaution de récupérer quatrieme->p dans pointeur
} //ici, quatrieme et pointeur disparaissent
//ca n'affiche pas "aie", quatrieme n'était qu'un pointeur;
return 0;//parce que malgré tout, main se termine bien.
} |
Partager