GNT sans publicité, site mobile, fonctionnalitées exclusives...

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
Lire les 10 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Marc Boyer
Le #262114
Le 26-09-2005, 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++.


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 ?

Stan
Le #262113
"slowlearner" 4337b2e0$0$7920$
Bonjour,

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 ?



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

slowlearner
Le #262112
Je viens de trouver la réponse (dans le bouquin :-))
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:
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


meow
Le #262111
Pour commencer tu n'as *déclaré* pHeap qu'une seule fois (au moment
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 ;)
slowlearner
Le #262110
Marc Boyer wrote:

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++.



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


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.


Publicité
Suivre les réponses
Poster une réponse
Anonyme