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

  FORUM HardWare.fr
  Programmation
  C++

  delete[] & tableau de pointeurs

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

delete[] & tableau de pointeurs

n°1212857
antsite
Je me souviens
Posté le 02-10-2005 à 14:30:00  profilanswer
 

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

mood
Publicité
Posté le 02-10-2005 à 14:30:00  profilanswer
 

n°1212981
spokup
Posté le 02-10-2005 à 17:48:06  profilanswer
 

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);

n°1212982
Taz
bisounours-codeur
Posté le 02-10-2005 à 17:54:27  profilanswer
 

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

n°1212983
Elmoricq
Modérateur
Posté le 02-10-2005 à 17:54:36  profilanswer
 

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]  

n°1213206
antsite
Je me souviens
Posté le 02-10-2005 à 22:39:34  profilanswer
 

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
n°1213243
Taz
bisounours-codeur
Posté le 02-10-2005 à 23:26:39  profilanswer
 

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

n°1213250
fluminis
Posté le 02-10-2005 à 23:41:19  profilanswer
 

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
n°1213254
Taz
bisounours-codeur
Posté le 02-10-2005 à 23:47:00  profilanswer
 

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.

n°1213257
fluminis
Posté le 02-10-2005 à 23:59:39  profilanswer
 

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
n°1213262
Taz
bisounours-codeur
Posté le 03-10-2005 à 00:28:14  profilanswer
 

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

mood
Publicité
Posté le 03-10-2005 à 00:28:14  profilanswer
 

n°1213525
antsite
Je me souviens
Posté le 03-10-2005 à 13:21:16  profilanswer
 

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 ?

n°1213530
Taz
bisounours-codeur
Posté le 03-10-2005 à 13:27:21  profilanswer
 

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

n°1213570
antsite
Je me souviens
Posté le 03-10-2005 à 13:58:27  profilanswer
 

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 ?

n°1213712
blackgodde​ss
vive le troll !
Posté le 03-10-2005 à 15:57:46  profilanswer
 

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 )-
n°1213846
benji_100
Posté le 03-10-2005 à 18:17:30  profilanswer
 

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)


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

  delete[] & tableau de pointeurs

 

Sujets relatifs
sql tableaumenu select qui affiche/cache les lignes d'un tableau
Marcro et Fusion d'un tableau Excel dans WordInsérer une page dans un tableau précis.
bordure d'une cellule d'un tableausupprimer une ligne d'un tableau
Tableau avec titres toujours visibles : FRAME ?comment centrer un tableau au millieu d'une page en css
tableau intDelete et tableau de pointeurs
Plus de sujets relatifs à : delete[] & tableau de pointeurs


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