Débutant pose question de débutant
Le
slowlearner
Bonjour,
Après en avoir caressé l'idée pendant quelques temps, j'ai récemment
décidé de me lancer dans l'aprentissage du langage C++ avec un double
objectif :
1- Le simple "plaisir" intellectuel d'apprendre qqchse de nouveau
2- Etre à terme capable de développer des applications personnellles.
Pour celà, j'ai fais (au pif) l'aquisition du bouquin "Le Langage C++"
chez Campus Press et j'ai également installé Dev-C++.
Pour l'instant, j'avance à mon rythme, mais face aux exemples et
exercices du bouquin, je me pose parfois des questions existentielles
pour lesquelles j'aurais besoin de l'avis d'experts.
Ainsi, ce matin, je potasse la section sur les pointeurs et j'ai le code
suivant :
#include <iostream>
int main()
{
using namespace std;
int localVariable=5;
int * plocal=&localVariable;
int * pHeap=new int;
*pHeap=7;
cout<<"localVariable :"<<localVariable<<endl;
cout<<"*plocal :"<<*plocal<<endl;
cout<<"*pHeap :"<<*pHeap<<endl;
--> delete pHeap;
pHeap=new int;
*pHeap=9;
cout<<"*pHeap :"<<*pHeap<<endl;
delete pHeap;
system("PAUSE");
return 0;
}
Si je supprime la première ligne "delete pHeap", le code compile tout de
même et me redonne les mêmes résultats.
La "question existentielle" que je me pose est donc la suivante : cette
ligne est-elle là pour éviter une "fuite de mémoire" (ce qui voudrait
dire que déclarer une deuxième fois pHeap réaffecte une deuxième adresse
mémoire), ou bien est-elle inutile dans la mesure où on a une ligne
"delete pHeap" vers la fin du programme ?
Merci d'avance pour vos réponses.
Patrick
Après en avoir caressé l'idée pendant quelques temps, j'ai récemment
décidé de me lancer dans l'aprentissage du langage C++ avec un double
objectif :
1- Le simple "plaisir" intellectuel d'apprendre qqchse de nouveau
2- Etre à terme capable de développer des applications personnellles.
Pour celà, j'ai fais (au pif) l'aquisition du bouquin "Le Langage C++"
chez Campus Press et j'ai également installé Dev-C++.
Pour l'instant, j'avance à mon rythme, mais face aux exemples et
exercices du bouquin, je me pose parfois des questions existentielles
pour lesquelles j'aurais besoin de l'avis d'experts.
Ainsi, ce matin, je potasse la section sur les pointeurs et j'ai le code
suivant :
#include <iostream>
int main()
{
using namespace std;
int localVariable=5;
int * plocal=&localVariable;
int * pHeap=new int;
*pHeap=7;
cout<<"localVariable :"<<localVariable<<endl;
cout<<"*plocal :"<<*plocal<<endl;
cout<<"*pHeap :"<<*pHeap<<endl;
--> delete pHeap;
pHeap=new int;
*pHeap=9;
cout<<"*pHeap :"<<*pHeap<<endl;
delete pHeap;
system("PAUSE");
return 0;
}
Si je supprime la première ligne "delete pHeap", le code compile tout de
même et me redonne les mêmes résultats.
La "question existentielle" que je me pose est donc la suivante : cette
ligne est-elle là pour éviter une "fuite de mémoire" (ce qui voudrait
dire que déclarer une deuxième fois pHeap réaffecte une deuxième adresse
mémoire), ou bien est-elle inutile dans la mesure où on a une ligne
"delete pHeap" vers la fin du programme ?
Merci d'avance pour vos réponses.
Patrick

Poser une question


Le bouquin de Bjarne Stroustrup ? Il est plutôt considéré comme
une livre de référence plus qu'un langage de débutant.
Il manque une info dans ton message: as-tu déjà programmé ?
Marc Boyer
--
À vélo, prendre une rue à contre-sens est moins dangeureux
que prendre un boulevard dans le sens légal. À qui la faute ?
Il doit y avoir parité entre les new ( ou new [] ) et delete ( ou
delete[] ).
char *c = new char[30];
delete[] c;
delete[] c; // comportement indéfini
Mais un oubli provoque une" fuite" de mémoire.
--
-Stan
Désolé du dérangement.
ps : réponse = oui, une deuxième déclaration de pHeap lui affecte bien
une nouvelle adresse mémoire. Le premier delete pHeap est donc nécessaire.
slowlearner wrote:
où tu donnes sont type) et tu l'as *définie* deux fois. Lors de la
déclaration, puis redéfinie un peu plus loin.
Pour répondre à ta question maintenant, la réponse s'approche de la
réponse 'fuite de mémoire' que tu as toi meme donnée. En effet, new
alloue de la mémoire quelque part pour y stocker ton objet et s'attend
à ce que tu faces les deletes qui conviennent une fois que tu en as
terminé (équivalent du malloc et du free en C, si cela te dit
quelques choses.). En bref, si tu vires le premier delete la place
mémoire précédement alouée pour ton *pHeap "continue d'exister"...
delete prend un pointeur en argument et "detruit" la zone mémoire
pointée. Le second delete va donc "désafecter" la place mémoire
alouée par ton second new. Mais la place mémoire occupée par ton
premier new est maintenant innacessible meme pour la destruction, car
tu n'as plus aucune idée de la valeur initiale du pointeur (celle
renvoyée par ton premier new).
Bon, c'est un peu simpliste mais ça me parrait compréhensible ;)
Le livre que j'ai a été rédigé par Jesse Liberty et Bradly Jones.
Pour répondre à ta deuxième question : oui et non ;-)
Oui, il fut un temps (que les moins de vingt ans ne peuvent pas
connaître ...) et où j'ai appris le basic (!!) sur les premiers
ordinateurs familiaux et quelques bribes d'assembleur. J'ai des bases
(très lointaines) aussi en Turbo Pascal...
...mais non, je ne suis pas programmeur et ne prétend pas l'être (d'où
le titre de mon message).
PS : merci pour toutes vos réponses rapides à ce message.