Delete et tableau de pointeurs

Delete et tableau de pointeurs - C++ - Programmation

Marsh Posté le 10-10-2002 à 14:40:13    

une fois de plus, je suis totalement embrouillé dans les pointeurs
 
j'ai donc 2 classes A et B.
 
j'ai fait:

Code :
  1. Class A
  2. {
  3. ...blablabla
  4. }
  5. Class B
  6. {
  7.   ...blablabla...
  8.   c **A;
  9.   ...blablabla...
  10. }
  11. B::B()
  12. {
  13.   // Allocation
  14.   c = new A*[50];
  15.   // Mise à NULL des pointeurs
  16.   for(int i=0; i<50; i++)
  17.   {
  18.     c[i] = NULL;
  19.   }
  20. }


Bon, apres je remplis mon bordel avec des c[i] = new B();
Et à la fin, je libere tout avec

Code :
  1. for( int i=0; i<50; i++)
  2. {
  3.   if( c[i] != NULL)
  4.   {
  5.     delete c[i];
  6.   }
  7. }


 
La question est :  
Est ce que mon tableau 'c' de 50 cases est aussi désalloué ?
Parce que dans ma tete, c = c[0] nan ?
Faut que je fasse un 'delete c;' après ma boucle ?
Si j'ai fait n'imp, merci de me montrer où.


Message édité par spark le 10-10-2002 à 14:48:57
Reply

Marsh Posté le 10-10-2002 à 14:40:13   

Reply

Marsh Posté le 10-10-2002 à 14:44:35    

... j'ai du mal ...
j'ai trouvé :
 
c'est :

Code :
  1. *c = c[0];


donc faut bien que je fasse un

Code :
  1. delete c;

après...

Reply

Marsh Posté le 10-10-2002 à 14:51:58    

Ceci dit, si tu fais un

Code :
  1. delete [] c;

à la place de la boucle pour désallouer les éléments de ton tableau, ce sera plus propre, plus simple et plus sûr. Ca désalloue le tableau (alloué par new[]) et tous les éléments qu'il contient, lorsqu'ils ont été alloués par new ou new[].
 
A part ça, ta déclaration de la classe B est vraiment bizarre...  :heink: Si je comprends bien, B contient un attribut c de type pointeur vers pointeur vers A (ce qui s'exprime par "A** c" et non "c **A", d'ailleurs).
Ce que me confirme la ligne :

Code :
  1. c = new A*[50];


Mais dans ce cas, tu ne peux pas affecter une valeur de type B* à c[i] dans la ligne :

Code :
  1. c = new B();

car [i]A* et B* sont 2 types complètement différents (tout comme le sont les types A et B).


Message édité par BifaceMcLeOD le 10-10-2002 à 14:55:04
Reply

Marsh Posté le 10-10-2002 à 15:06:29    

Ouais, j'me suis 'un peu' vautré dans les syntaxes :D
c'est bien des A* que je stocke dans un tableau c dans ma classe B.
 
Sinon, merci beaucoup pour le delete [] c;  
J'avais totalement oublié que ca existait, et c'est effectivement bcp + propre que ma vieille boucle.

Reply

Marsh Posté le 10-10-2002 à 16:35:43    

Copier/coller rulez...  ;)

Reply

Marsh Posté le 10-10-2002 à 17:11:21    

Non, c n'imp !
J'viens de me prendre la tete pour rien pendant 2h.....
 
le delete [] ne fonctionne que si c'est un tableau d'objets.
avec un tableau de pointeurs sur ces objets, le delete ne fonctionne pas, le destructeur n'est pas appellé.  
J'ai fais tout plein de tests pour ca.
Donc faut faire une boucle comme j'avais fais pour chaque effacer chaque element du tableau.
Ce qui confirme la regle:  
il doit y avoir autant de delete que de new.
 
Bon, sur ce, je me casse, bonne soirée @demain

Reply

Marsh Posté le 11-10-2002 à 03:08:34    

C'est pas bien d'embrouiller ceux qui posent des questions.
Si l'objet détruit est un pointeur, ce qui est pointé n'est pas affecté.
 

Code :
  1. if( c[i] != NULL)
  2. delete c[i];

Inutile !
On à le droit de deleter NULL, ça ne fait rien.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 11-10-2002 à 03:53:47    

c != c[0]
(ou alors seulement dans ta tete)
 
en fait c[0]==*c dans le cas d'un type*.
 
LeGreg

Reply

Marsh Posté le 11-10-2002 à 10:45:04    

Musaran a écrit a écrit :

C'est pas bien d'embrouiller ceux qui posent des questions.
Si l'objet détruit est un pointeur, ce qui est pointé n'est pas affecté.
 

Code :
  1. if( c[i] != NULL)
  2. delete c[i];

Inutile !
On à le droit de deleter NULL, ça ne fait rien.




ok, merci, ca fera plus propre :)

Reply

Marsh Posté le 11-10-2002 à 10:47:33    

Toutes mes viles excuses...  :jap:

Reply

Marsh Posté le 11-10-2002 à 10:47:33   

Reply

Marsh Posté le 11-10-2002 à 10:51:02    

BifaceMcLeOD a écrit a écrit :

Toutes mes viles excuses...  :jap:  




 
Lol, c pas grave, au moins j'ai tout testé dans tous les sens, et j'ai tout compris maintenant. :D
J'ai appris plein de trucs là, meme si j'ai failli manger mon clavier...

Reply

Marsh Posté le 11-10-2002 à 13:09:54    

ce spark la est il le spark que je connais ? [:wam]

Reply

Marsh Posté le 11-10-2002 à 14:15:22    

oui, c bien le spark que tu connais.
t'as vu, j'ai un peu laché le VB :D

Reply

Marsh Posté le 11-10-2002 à 14:59:03    

ouais mais visiblement t'aurais pas du [:ddr555]
 
T tjs sur besac ?  

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed