delete[] & tableau de pointeurs

delete[] & tableau de pointeurs - C++ - Programmation

Marsh Posté le 02-10-2005 à 14:30:00    

Salut,
 
A **a;
a[0] = new A(1);
a[1] = new A(2);
...
delete[] a; suffit à libérer la mémoire ou faut faire un delete a[0], delete a[1], etc ?
 
je me demande ça car c'est pas tout à fait comme  
A *a = new A[14]; et la delete[] c'est bon. (Mais je peux pas procéder de la sorte car je n'appelle pas toujours le constructeur par défaut)
 
merci

Reply

Marsh Posté le 02-10-2005 à 14:30:00   

Reply

Marsh Posté le 02-10-2005 à 17:48:06    

en fait dans le cas d'un double pointeur tu a doit allouer d'abord le premier pointeur
 
(désolé j'écris en C mais le problème est le meme)
 
A **a;
a  = (A**)malloc(sizeof(*A)*2);
 
puis allouer les pointeurs créés lors de la premiere allocation
 
a[0] = (A*)malloc(sizeof(A)*8);
a[1] = (A*)malloc(sizeof(A)*7);
 
et pour libérer meme demarche
 
free(a[0]);
free(a[1]);
free(a);

Reply

Marsh Posté le 02-10-2005 à 17:54:27    

dégage avec ton C, ça vaut rien, tu n'y comprends rien.
 
 
en C++, déjà il te faut allouer le A**, puis chacun des A*. En as tu vraiment besoin ? un A a[10]; ne conviendrait pas ? Est-ce que tu connais std::vector<> ?

Reply

Marsh Posté le 02-10-2005 à 17:54:36    

Il faut autant de delete que de new.
 

spokup a écrit :

(désolé j'écris en C mais le problème est le meme)
 
A **a;
a  = (A**)malloc(sizeof(*A)*2);
 
puis allouer les pointeurs créés lors de la premiere allocation
 
a[0] = (A*)malloc(sizeof(A)*8);
a[1] = (A*)malloc(sizeof(A)*7);


 
En C,  le cast sur un void* est inutile. [:petrus75]  

Reply

Marsh Posté le 02-10-2005 à 22:39:34    

Taz a écrit :

dégage avec ton C, ça vaut rien, tu n'y comprends rien.
 
 
en C++, déjà il te faut allouer le A**, puis chacun des A*. En as tu vraiment besoin ? un A a[10]; ne conviendrait pas ? Est-ce que tu connais std::vector<> ?


 
je suis en effet passé par

Code :
  1. Day *days[31];


et c'est sur que vector pour éviter le ** je n'y pensais plus.
mais donc pour delete, j'ai fait ça :

Code :
  1. for(int i=0; i<31; i++)
  2.    delete days[i];


 
Je me trompe, il y a mieux ?
merci  :hello:


Message édité par antsite le 02-10-2005 à 22:40:01
Reply

Marsh Posté le 02-10-2005 à 23:26:39    

bah
 
Day days[31];
 
 
et voilà ...

Reply

Marsh Posté le 02-10-2005 à 23:41:19    

une autre solution quand tu fais un tableau a deux dimensions c'est de faire :
 

Code :
  1. float** matrice;
  2. sizeX = 10;
  3. sizeY = 12;
  4. //on alloue la memoire
  5. matrice = new float* [sizeX];
  6. matrice[0] = new float[sizeX*sizeY];
  7. for(int i=1;i<sizeX;i++)
  8. {
  9. matrice[i] = &(matrice[0][sizeY*i]);
  10. }


et pour desallouer la memoire :

Code :
  1. delete [] matrice[ 0 ];
  2. delete [] matrice;


si en plus tu as besoin de parcourrir ton tableau ca peut accelerer les temps d'acces


---------------
http://poemes.iceteapeche.com - http://www.simuland.net
Reply

Marsh Posté le 02-10-2005 à 23:47:00    

c'est nul tu peux tout faire en une allocation (j'ai déjà posté du code template pour). Mais c'est se faire chier pour rien. Y a des matrice bien foutu dans boost.

Reply

Marsh Posté le 02-10-2005 à 23:59:39    

le code que je viens de fournir remplace ce genre de code :
 

Code :
  1. float** matrice;
  2. matrice = new *float[sizeX]
  3. for(int i=0;i<sizeX;i++)
  4. {
  5.     matrice[i] = new float[sizeY];
  6. }


 
et si tu as besoin de parcourir tout le tableau c'est relativement plus rapide.
Et je suis bien placé pour savoir que lors que l'on cherche a optimiser son code pour le rendre vraiment rapide il peut etre interessant de faire soit meme son allocation memoire et meme pousser le vice a faire mumuse comme je l'ai montré dans mon post précedent
 
Faite des tests de rapidité entre les différentes sollutions ça m'interesse
 
++


---------------
http://poemes.iceteapeche.com - http://www.simuland.net
Reply

Marsh Posté le 03-10-2005 à 00:28:14    

le premier code est bien meilleur mais est perfectible. Et il n'y aucune gestion d'exception ici.

Reply

Marsh Posté le 03-10-2005 à 00:28:14   

Reply

Marsh Posté le 03-10-2005 à 13:21:16    

Taz a écrit :

bah
 
Day days[31];
 
 
et voilà ...


 
oui mais justement ça j'en veux pas pour ce que je disais au début
je n'appelle pas toujours le constructeur par défaut
 
d'où le besoin de faire

Code :
  1. new Day(params);

, non ?

Reply

Marsh Posté le 03-10-2005 à 13:27:21    

non.
 
Day days[31] = { Day("Lundi" ), ... };

Reply

Marsh Posté le 03-10-2005 à 13:58:27    

Taz a écrit :

non.
 
Day days[31] = { Day("Lundi" ), ... };


 
ouh la oui je connaissais pas vraiment cette syntaxe, du moins pas avec des types persos...
A ma place tu te tapperais les 31 objets comme ça ou alors une boucle avec un new dedans ?

Reply

Marsh Posté le 03-10-2005 à 15:57:46    

les 31 objets comme ca
 
edit : enfin ca depend aussi de la taille des objets, que ca fracasse pas non plus la pile


Message édité par blackgoddess le 03-10-2005 à 15:58:28

---------------
-( BlackGoddess )-
Reply

Marsh Posté le 03-10-2005 à 18:17:30    

Citation :


A ma place tu te tapperais les 31 objets comme ça ou alors une boucle avec un new dedans ?


 
Comment tu peux faire une boucle si tu dois faire un traitement particulier pour chacun des éléments ? (appel d'un constructeur différent)

Reply

Sujets relatifs:

Leave a Replay

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