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