Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1512 connectés 

  FORUM HardWare.fr
  Programmation

  [Help] Acquis de conscience en c++ ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Help] Acquis de conscience en c++ ?

n°82009
Rob Roy
Posté le 17-12-2001 à 02:26:27  profilanswer
 

je créé une classe composé ayant comme donnée membre un tableau dynamique et d'autres trucs
a chaque fois que je créé un objet de cette classe je 'alloue (new ...) donc ce tableau dynamique pour le reutiliser plus tard ds une autre classe.
 
Ma question concerne en realité le destruceur. Dois-je desallouer par delete les tableaux que je créé, a la fin de mon programme, ou le destructeur se charge t'il de le faire pour moi.
 
Sinon comment faire ?
 
Merchi
 
++

mood
Publicité
Posté le 17-12-2001 à 02:26:27  profilanswer
 

n°82012
SoWhatIn22
Posté le 17-12-2001 à 08:48:47  profilanswer
 

hello,
 
quand tu fais une allocation dynamique, c'est TOUJOURS à toi de faire la désallocation (sauf pour certaines API très particulières dont on ne parlera pas ici).
 
Les détruire explicitement dans le detructeur me semble une bonne idée ;) Personnellement, quand je fait une désallocation, je mets TOUJOURS ensuite le pointeur à NULL. Et donc dans le destructeur, tu peux faire un
if(ptr != NULL)
{
    delete [] ptr;
    ptr = NULL;
}
 
A priori cela ne coute pas grabd chose.
 
Par contre attention, car si tu utilises ce tableau dans une autre classe et que la classe qui l'a crée, il peut y avoir un soucis :D Attention donc de ne pas utiliser le tableau une fois qu'il a été détruit :D
 
a+

n°82015
El_gringo
Posté le 17-12-2001 à 09:24:01  profilanswer
 

SoWhatIn22 a écrit a écrit :

hello,
 
quand tu fais une allocation dynamique, c'est TOUJOURS à toi de faire la désallocation (sauf pour certaines API très particulières dont on ne parlera pas ici).
 
Les détruire explicitement dans le detructeur me semble une bonne idée ;) Personnellement, quand je fait une désallocation, je mets TOUJOURS ensuite le pointeur à NULL. Et donc dans le destructeur, tu peux faire un
if(ptr != NULL)
{
    delete [] ptr;
    ptr = NULL;
}
 
A priori cela ne coute pas grabd chose.
 
Par contre attention, car si tu utilises ce tableau dans une autre classe et que la classe qui l'a crée, il peut y avoir un soucis :D Attention donc de ne pas utiliser le tableau une fois qu'il a été détruit :D
 
a+  




 
Bah, si le programme est bien fait, ce tableau ne doit être accessible par l'intermédiaire de l'instance qui contient le tableau. Si le tableau est désalloué dans le destructeur de l'instance qui contient le tableau, impossible de tenter d'utiliser le tableau du moment qu'il à été détruit ! c qd même génial l'objet !

n°82042
LeGreg
Posté le 17-12-2001 à 11:02:10  profilanswer
 

Le destructeur n'est appele que dans les cas suivants:
- tu arrives a la fin du scope de ton objet
(alloue sur la pile => destruction automatique en fin
de procedure, objet membre =>
destruction automatique a la destruction de l'objet
qui le contient, allocation globale => destruction a la sortie de l'application)
- tu appelles delete sur cet objet (si celui-ci a  
ete prealablement alloue par new).
 
Quand je dis "objet membre" cela exclut bien evidemment
les pointeurs et les references. Dans ce cas, il faut definir
QUI doit detruire les objets pointes ou references. C'est a toi de definir ta convention, mais il faut s'y tenir strictement parce que chaque objet ne peut etre detruit qu'une seule fois (sinon plantage!).
 
A+
LEGREG

n°82113
Rob Roy
Posté le 17-12-2001 à 14:16:48  profilanswer
 

merci pour tout ca, mais cela n'arrange pas mon affaire, car le fait de detruire une objet membre ds le destructeur , voir meme ailleurs pose des problemes (ERROR / DAMAGE ...)
je vous pose ma class
 
class Ligne
{
 private :
  short* ligne;
  ...
 public :
  Ligne();
  void Saisir(int taille);
                 ...
  ~Ligne();
};
quand je saisis un objet de Ligne je fais a l'interieur un
ligne = new short [taille] ;
donc je renseigne la donnée membre ligne
 
mais si je met ds le destructeur ou meme ailleur un delete [] ligne
ou meme un free(ligne) (qUI n'appelle pas le destructeur)
j'ai un gros message d'erreur
quoi faire pour dessalouer cette !!!! de memoire ?

n°82117
El_gringo
Posté le 17-12-2001 à 14:22:35  profilanswer
 

un truc possible : ton membre ligne appartient à la classe Ligne ... peut être qu'il aime pas trop ça !

n°82121
Rob Roy
Posté le 17-12-2001 à 14:36:19  profilanswer
 

ben logiquement non car  
le tableau de short ligne est en minuscule
et la classe Ligne est en majuscule  
(je parle du "L" )
donc il s'agit de 2 chose differente

n°82123
Rob Roy
Posté le 17-12-2001 à 14:37:11  profilanswer
 

ok je viens de capter
oui c ca et je pense (suis presque sur) que le probleme vient de la
et je cherche en faite la technique pour contourner ce prob

n°82125
El_gringo
Posté le 17-12-2001 à 14:43:44  profilanswer
 

...bah, changer le nom de ton membre !!
d'ailleur normalement, on préfixe les attributs de classe par m_, puis une lettre qui indique le type du membre. Si ton prog était écrit selon les normes, ça donnerai
m_lpsLigne.
lp signifiant qu'il s'agit d'un pointeur

n°82126
LeGreg
Posté le 17-12-2001 à 14:44:00  profilanswer
 

Rob Roy a écrit a écrit :

merci pour tout ca, mais cela n'arrange pas mon affaire, car le fait de detruire une objet membre ds le destructeur , voir meme ailleurs pose des problemes (ERROR / DAMAGE ...)
je vous pose ma class
 
class Ligne
{
 private :
  short* ligne;
  ...
 public :
  Ligne();
  void Saisir(int taille);
                 ...
  ~Ligne();
};
quand je saisis un objet de Ligne je fais a l'interieur un
ligne = new short [taille] ;
donc je renseigne la donnée membre ligne
 
mais si je met ds le destructeur ou meme ailleur un delete [] ligne
ou meme un free(ligne) (qUI n'appelle pas le destructeur)
j'ai un gros message d'erreur
quoi faire pour dessalouer cette !!!! de memoire ?  




 
deja tu commences par ne pas utiliser free sur un objet
alloue par new! new ce n'est pas un malloc.
 
Ensuite es-tu sur d'appeler toujours ton destructeur
sur un membre initialise?
(par exemple tu peux l'initialiser a NULL
tant qu'il n'est pas rempli et
faire le test de SoWhatIn dans le destructeur)
 
A+
LEGREG

mood
Publicité
Posté le 17-12-2001 à 14:44:00  profilanswer
 

n°82132
Rob Roy
Posté le 17-12-2001 à 14:50:27  profilanswer
 

oui j'en suis certain !
mon main pour le test est  
 
Ligne P;
P.Saisir(2);
P.Afficher();
 
et c tout
et il trouve le moyen de me foutre une erreur qund je fais un delete [] ligne ds le constructeur !

n°82135
LeGreg
Posté le 17-12-2001 à 14:54:51  profilanswer
 

essaie de poster le code complet du truc
ou un exemple simple qui plante
j'crois qu'il nous manque du materiel
pour juger..
 
LEGREG

n°82142
Rob Roy
Posté le 17-12-2001 à 15:08:30  profilanswer
 

El_Gringo a écrit a écrit :

...bah, changer le nom de ton membre !!
d'ailleur normalement, on préfixe les attributs de classe par m_, puis une lettre qui indique le type du membre. Si ton prog était écrit selon les normes, ça donnerai
m_lpsLigne.
lp signifiant qu'il s'agit d'un pointeur  




 
non je sais tout ca mais comme mon binome est un nb de chez nb en c++ (ce qui ne veut pas dire que je soit un boss) ds un premier tps on avait pris des termes tout simple.Mais cela ne change rien de tte facon !
 
enfin bon voila mon code simplifié de tout ce qui n'est pas important
class CLigne
{
 private :
  short* m_lpsLigne;
  ...
 public :
  CLigne();
  void Saisir(int taille);
                ...
1  ~CLigne();
 
};
 
void CLigne::Saisir(int taille)
{  
 m_lpsLigne = new short [taille] ;  
 for (int i=1;i<=taille;i++)
 {
  cin >> m_lpsLigne[i];
 }
}
 
CLigne::~CLigne()
{
 delete [] m_lpsLigne;
}
 
edit : et mon main n'est qu'un simple  
CLigne L;
L.Saisir(3); et c tout !!!

 

[edtdd]--Message édité par Rob Roy--[/edtdd]

n°82145
LeGreg
Posté le 17-12-2001 à 15:13:20  profilanswer
 

Rob Roy a écrit a écrit :

 
void CLigne::Saisir(int taille)
{  
 m_lpsLigne = new short [taille] ;  
 for (int i=1;i<=taille;i++)
 {
  cin >> m_lpsLigne[i];
 }
}




 
attention un tableau en C/C++
commence a 0 et finit a taille-1.
 
[OT]
Je ne sais pas si c'est plus logique qu'une autre
numerotation et je ne veux pas le savoir mais
c'est comme ca :)
[/OT]
 
LEGREG

n°82154
Rob Roy
Posté le 17-12-2001 à 15:29:44  profilanswer
 

up

n°82159
LeGreg
Posté le 17-12-2001 à 15:34:08  profilanswer
 

ca marche pas mieux avec 0 et taille-1??
 
LEGREG

n°82161
Rob Roy
Posté le 17-12-2001 à 15:37:16  profilanswer
 

merci pour ce ptit detail que j'avais oublié  
nmais ca marche pas mieux, car en fait meme si mes tableaux etait plus grand que la normal (...) l'espace etait quand meme alloué et le probleme reste le meme !

n°82164
LeGreg
Posté le 17-12-2001 à 15:39:28  profilanswer
 

j'crois qu'il faut que tu rajoutes encore
un bout de ton programme..
 
LEGREG

n°82171
Rob Roy
Posté le 17-12-2001 à 15:48:17  profilanswer
 

nop ca suffit car le prog plante quand mon main a =>
 
void main()
{
 CLigne P;
 P.Saisir(2);
}
 
ridicule quoi

n°82176
Rob Roy
Posté le 17-12-2001 à 16:01:14  profilanswer
 

personne ? :cry:  :cry:  :cry:

n°82180
LeGreg
Posté le 17-12-2001 à 16:04:52  profilanswer
 

ben tu as l'air de savoir la ou ca plante
malheureusement
je crois qu'il nous manque encore du code
 
=> pourquoi ne pas nous donner au moins
toute l'implantation de CLine?
 
J'imagine egalement que le "1"devant la declaration de "~CLigne()"
est une erreur de copier-coller..
 
LEGREG

n°82181
Rob Roy
Posté le 17-12-2001 à 16:08:41  profilanswer
 

class CLigne
{
 friend class CMatrice;
 private :
  short* m_lpsLigne;
  bool m_bOnly0;
 public :
  CLigne();
  void Saisir(int taille);
  void Afficher();
  void Ajouter(CLigne L);
  ~CLigne();
 
};

n°82182
Rob Roy
Posté le 17-12-2001 à 16:10:40  profilanswer
 

en passant ya t'il un moyen d'empecher l'utilisateur de taper autre chose qu'un int ou un short dans un cin ou encore un moyen de tester les valeur que l'utilisateur rentre ?

n°82186
Rob Roy
Posté le 17-12-2001 à 16:23:56  profilanswer
 

snif ...

n°82189
LeGreg
Posté le 17-12-2001 à 16:24:45  profilanswer
 

Code :
  1. short entree;
  2. while (!(std::cin >> entree))
  3. {
  4.    std::cout << "Essaie encore !"<< std::endl;
  5. };


 
Sinon, je veux bien jouer au puzzle
mais ca va etre dur de t'aider
 
LEGREG

n°82200
Rob Roy
Posté le 17-12-2001 à 16:36:14  profilanswer
 

merci pour qui ya en haut
euh j'ai tout mis  
je remet tout ds un post if y like
 
 
class CLigne  
{  
friend class CMatrice;  
private :  
 short* m_lpsLigne;  
 bool m_bOnly0;  
public :  
 CLigne();  
 void Saisir(int taille);  
 void Afficher();  
 void Ajouter(CLigne L);  
 ~CLigne();  
 
};  
 
 
CLigne::CLigne()
{
 m_lpsLigne=NULL;
 m_bOnly0=true;
}
 
void CLigne::Saisir(int taille)
{  
m_lpsLigne = new short [taille-1] ;  
for (int i=0;i<=taille-1;i++)
{
 cin >> m_lpsLigne[i];
}
}
 
CLigne::~CLigne()
{
delete [] m_lpsLigne;
}
 
void main()  
{  
CLigne P;  
P.Saisir(2);  
}

n°82204
Rob Roy
Posté le 17-12-2001 à 16:42:01  profilanswer
 

au fait il sort d'ou le std

n°82219
Rob Roy
Posté le 17-12-2001 à 16:58:26  profilanswer
 

svp  :cry:  :cry:

n°82225
LeGreg
Posté le 17-12-2001 à 17:13:15  profilanswer
 

quand je disais qu'un tableau ca va de 0 a taille-1
taille c'est la taille du tableau
et il faut donc faire un  
tableau = new short[taille]; <-- cree un tableau a taille element
numerotes de 0 a taille-1
 
LEGREG

n°82231
LeGreg
Posté le 17-12-2001 à 17:23:37  profilanswer
 

le std c'est juste pour dire que cin et cout  
sont definis dans l'espace de nom std
 
Tu peux eviter de preciser l'espace de nom
a chaque fois en mettant une fois pour toute
au debut de ton fichier
using namespace std;
 
par contre je ne vois pas ou tu as mis
ton  
#include <iostream>  
c'est le fichier qui contient les definitions
de cin et cout
 
A+
LEGREG

n°82272
Rob Roy
Posté le 17-12-2001 à 19:15:33  profilanswer
 

ca a l'air ok
je te remercie pour ta patience :)

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  [Help] Acquis de conscience en c++ ?

 

Sujets relatifs
[HELP] [DOS] Tester qu'une partition existante est formatéecomment faire les 3 action?????????????help
SOFT MULTIFONCTIONS POUR UNE DIVX BOX => Please Help[PHP & MySQL] PB ?help me
comment inserer dans phpMyAdmin???? HELP ME[CaML] Help pour la conception d'un deriveur d'expression algebrique
Need Help[VC++] dll pour le port parallele, need help !
[ASP+SQL] help !!Turbo Pascal et equa -diff :(( Help me
Plus de sujets relatifs à : [Help] Acquis de conscience en c++ ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR