OVH Cloud OVH Cloud

Débutant pose question de débutant

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

10 réponses

Avatar
Marc Boyer
Le 26-09-2005, slowlearner a écrit :
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 ?

Avatar
Stan
"slowlearner" a écrit dans le message de news:
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

Avatar
slowlearner
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


Avatar
meow
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 ;)
Avatar
slowlearner
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.


Avatar
Marc Boyer
slowlearner a écrit :
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...


Aurais-tu l'obligeance de nous dire ce que tu en penses
après quelques semaines de pratique ?

Pour une majorité d'entre nous, qui ne sommes plus des
débutants, il est difficile de juger des livres pour
débutants, et pourtant on nous en demande.

Marc Boyer
--
À vélo, prendre une rue à contre-sens est moins dangeureux
que prendre un boulevard dans le sens légal. À qui la faute ?

Avatar
slowlearner
Marc Boyer wrote:

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



Aurais-tu l'obligeance de nous dire ce que tu en penses
après quelques semaines de pratique ?

Pour une majorité d'entre nous, qui ne sommes plus des
débutants, il est difficile de juger des livres pour
débutants, et pourtant on nous en demande.

Marc Boyer



Je n'en suis encore qu'à un bon tiers du bouquin. Il serait donc
difficile (injuste ?) de prétendre à donner un avis objectif sur ce livre.

Cependant, mes premières impressions en tant que débutant sont que ce
livre remplit à peu prêt honnêtement sa mission (initier au C++) sans
chichi ni fioritures. L'apprentissage semble cependant ardu, mais là,
c'est peut-être dû autant au langage lui-même qu'au bouquin ...

ps : dans le même ordre d'idées, je recommande vivement Dev-C++. Idéal
pour un débutant (contrairement aux "usines à gaz" que peuvent être
Borland C++ ou même VisualC++)


Avatar
meow
Moi qui suis sous linux j'utilises le plugin CDT d'eclipse... C'est pas
mal sans etre la panacée... En particulier il me semble que la
completion a énormément de mal avec les template... Ce qui est
passablement genant. En fait, je suis tout surpris lorsque je codes un
exemple simple et que je vois s'afficher automatiquement les fenetres
de completion !
Avatar
Xandros
Moi qui suis sous linux j'utilises le plugin CDT d'eclipse... C'est pas
mal sans etre la panacée... En particulier il me semble que la
completion a énormément de mal avec les template... Ce qui est
passablement genant. En fait, je suis tout surpris lorsque je codes un
exemple simple et que je vois s'afficher automatiquement les fenetres
de completion !


Salut,

Tu devrais essayer Anjuta, il est bien plus léger que Eclipse et chez
moi il fonctionne mieux.

Eclipse Bug sur des programmes imples alors que Anjuta fonctionne très bien.

PS : Je suis un novice, je n'ai commencé le C++ que depuis 1 semaine.
Sous Windows j'utilise DevC++ et Borland C++ Builder 6.


--
Message envoyé avec Thunderbird
Sous Linux Xandros 3.0 Deluxe

Avatar
Michel Michaud
Dans le message ,
Pour une majorité d'entre nous, qui ne sommes plus des
débutants, il est difficile de juger des livres pour
débutants, et pourtant on nous en demande.


D'un autre côté, les débutants ne sachant pas ce qu'il devrait
apprendre et comment, il leur est difficile de porter un
jugement sur la qualité du livre au niveau C++. Au mieux, on
aura un avis utile sur l'aspect pédagogique du livre...

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/