Rappels C++Les pointeurs
1
Notion de pointeursTravailler avec les pointeurs c’est
Se rapprocher du matériel Nécessite de bien connaitre le fonctionnement de la
mémoireFaire des applications rapidesFaire des applications bugéesAvoir mal à la tête
2
Notion de pointeursTravailler avec les pointeurs c’est
Se rapprocher du matérielFaire des applications rapides
Réserver la mémoire quand on en a besoinFaire des applications bugéesAvoir mal à la tête
3
Notion de pointeursTravailler avec les pointeurs c’est
Se rapprocher du matérielFaire des applications rapidesFaire des applications bugées
Oublier de libérer la mémoire « segmentation fault »
Avoir mal à la tête
4
Notion de pointeursTravailler avec les pointeurs c’est
Se rapprocher du matérielFaire des applications rapidesFaire des applications bugéesAvoir mal à la tête
Des comportements du programme bizarre Des raisonnements très poussés
5
Rassurons nous un peu…Les pointeurs, c’est compliqué
En effet, même les plus grands programmateurs font encore ce genre d’erreurs (Windows, Half-Life…)
Les pointeurs, c’est pour nous faire ch..En effet, on en aura bientôt plus besoin (java,
C#...)
6
Mais…Les pointeurs, c’est pas si compliqué
Avec de la méthode et en prenant du temps, on y arrive (et même facilement)
Les pointeurs, c’est utileLorsque l’on recherche la rapidité (jeux vidéo,
programmation Temps réel,…) on est obligé d’y passer
7
(Rappels sur ) le matérielOrganisation de la mémoire
8
Programme réel (toto.exe)Comprend le code et les constantes
Variables statiques(toutes les variables sauf les pointeurs)
Variables dynamiques(les pointeurs)
Paramètres des fonctions
9
Suite des rappelsZoom sur la pile et le tas
Augmente quand on appelle une fonction (on empile les paramètres de la fonction et les paramètres locaux (et 2-3 autres trucs))
Augmente quand on fait appel à l’instruction new
Rappels…Finalement :
10
i
4ABF
4AC0
4ABE
23A9
23AA
23A8
p23A623
int i;int *p;i=23;//diff entre i et &i ?p=&i;//diff entre p et *p ?i=58;//valeur de *p ?p=new int;*p=6;
58
F3DE0F4D
23A7
23A6
23A5
23A4 Prog
BSS
Tas
23A8
23A8 6
Rappels…Exemples de bugs :
11
4ABF
4AC0
4ABE
23A9
23AA
23A8
p23A8int *p;p=new int;p=new int;*p=6;
F3DE0F4D
23A7
23A6
23A5
23A4
Prog
BSS
Tas
6
23A9
23A823A8
23A923A9
Rappels…Exemples de bugs :
12
4ABF
4AC0
4ABE
23A9
23AA
23A8
p23A8
int *p;int *q;p=new int;q=p;*p=6;delete p;cout<<*q; F3D
E0F4D
23A7
23A6
23A5
23A4Prog
BSS
Tas
6
23A8 q
23A8
Segmentation Fault !!!
De la mémoire sur mesureHalf life 2 : 4Go de texture, de sons…Windows Vista : 4Go de programmes…
Question :Comment faire pour jouer à Half Life 2 quand
on exécute Windows Vista sur une machine ne disposant que de 1Go de mémoire vive?
13
RéponseVista et Half Life2 ne doivent pas charger
tout en mémoire…Uniquement ce qu’il faut
Conclusion :Vive les pointeurs
14
Utilité du pointeur :On veut charger une map?
new…On veut décharger une map ?
delete...
D’où l’explication du « loading »Succession de new et delete…
15
Utilité du pointeurOK, c’est utile… On utilise plus que ça?C’est tout a fait possible, mais :
Très compliqué à utiliser Penser à faire un delete dès que nécessaire 3 instructions pour l’utiliser (déclarer, new et
delete)Coûteux en terme de place
Un entier pour sauver l’adresse en mémoire L’objet en lui même
16
Quand utiliser un pointeur ?Quand on utilise un « gros » objet.
Quand l’objet contient beaucoup d’attributsQuand on sait ne sait pas quand on aura
besoin de la variableInteraction avec utilisateur, paquets réseau…
Quand on fait un exercice sur les pointeurs…
17
Quand utiliser un pointeur ?Une fois les bases apprises et acquises, on
est tenté d’en utiliser partout.Danger : oublier de faire un delete !
IMPORTANT :Implémenter les destructeurs à chaque fois
que l’on a un attribut de type pointeur !
18
00A0 00A1 00A2 00A3 00A4 00A5 00A6 00A7 00A8 00A9 00AA 00AB 00AC 00AD 00AE 00AF 00B0
19Code du programme BSS Tas
void main(){node exemple(0);exemple.valeur=0;exemple.suivant=new node(5);node *iter;iter=&exemple;iter=iter->suivant;node *iter2=iter;iter2->suivant=new node(10);iter2=iter2->suivant;iter2->suivant=new node(20);iter2=null;iter=null;delete iter;iter=null;
}
class node{int valeur;node *suivant;
}
00A0 00A1 00A2 00A3 00A4 00A5 00A6 00A7 00A8 00A9 00AA 00AB 00AC 00AD 00AE 00AF 00B0
20Code du programme BSS Tas
void main(){node *iter=new node(-1);for(int i=0;i<5;i++){
iter->suivant=new node(i);iter=iter->suivant();
};node *iter1=iter;iter=iter1;for(int i=0;i<5;i++){
cout<<iter->valeur;iter=iter->suivant();
}}
class node{int valeur;node *suivant;
}
00A0 00A1 00A2 00A3 00A4 00A5 00A6 00A7 00A8 00A9 00AA 00AB 00AC 00AD 00AE 00AF 00B0
21Code du programme BSS Tas
void main(){node *iter=new node(-1);node *iter1=iter;for(int i=0;i<5;i++){
iter->suivant=new node(i);iter=iter->suivant();
}iter=iter1;while (iter != null) {
cout<<iter->valeur;iter=iter->suivant();
}}
class node{int valeur;node *suivant;
}