delete[] & tableau de pointeurs - C++ - Programmation
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); 
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<> ?
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)  | 
 
 
En C,  le cast sur un void* est inutile. ![[:petrus75] [:petrus75]](https://forum-images.hardware.fr/images/perso/petrus75.gif) 
  
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.  | 
 
 
je suis en effet passé par 
| Code : 
 | 
 
et c'est sur que vector pour éviter le ** je n'y pensais plus. 
mais donc pour delete, j'ai fait ça : 
| Code : 
 | 
 
 
Je me trompe, il y a mieux ? 
merci  
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 : 
 | 
 
et pour desallouer la memoire : 
| Code : 
 | 
 
si en plus tu as besoin de parcourrir ton tableau ca peut accelerer les temps d'acces
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.
Marsh Posté le 02-10-2005 à 23:59:39
le code que je viens de fournir remplace ce genre de code : 
 
| Code : 
 | 
 
 
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 
 
++ 
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.
Marsh Posté le 03-10-2005 à 13:21:16
| Taz a écrit : bah  | 
 
 
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 : 
 | 
, non ?
Marsh Posté le 03-10-2005 à 13:27:21
ReplyMarsh Posté le 03-10-2005 à 13:58:27
| Taz a écrit : non.  | 
 
 
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 ?
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
Marsh Posté le 03-10-2005 à 18:17:30
| Citation :   | 
 
 
Comment tu peux faire une boucle si tu dois faire un traitement particulier pour chacun des éléments ? (appel d'un constructeur différent)
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