Quand on fait "classe variable[256]", ça réserve 256*size(classe) de place mémoire ?
Mais quand on fait "classe *variable[256]", qu'est ce que ça fait exactement ?
Merci d'avance...
Message édité par vincent0 le 12-05-2005 à 10:27:42
Publicité
Posté le 10-05-2005 à 17:20:23
chagarou
Posté le 10-05-2005 à 17:25:34
1. oui
2. ca créer 256 pointeurs* qui pointent sur n'importe quoi vu que pas initialisés.
* 4 octets/pointeurs sur PC et avec les compilateurs que j'ai pu utiliser
vincent0
Posté le 10-05-2005 à 18:14:09
Merci...
Deux autres petites questions:
L'instruction "delete[] variable;" permet de libérer tous les pointeurs non initialisés ?
Quelle différence y a-il entre ses 2 lignes de code:
classe variable(...paramètres...);
classe *variable = new classe(...paramètres...);
blastman
just me !
Posté le 10-05-2005 à 18:16:35
dans le deuxieme cas tu alloue dynamiquement de la mémoire, pas dans le premier
Message édité par blastman le 10-05-2005 à 18:18:13
L'instruction "delete[] variable;" permet de libérer tous les pointeurs non initialisés ?
non, delete[] désalloue de la mémoire allouée par new[].
vincent0
Posté le 10-05-2005 à 18:44:15
Donc si dans un fichier .h j'ai ceci:
classe variable[256];
et dans le fichier .cpp ceci:
variable[0] = new classe(???);
variable[1] = new classe(???);
variable[2] = new classe(???);
....
variable[55] = new classe(???);
je perd 200*4 octets ? Y a-til une solution pour éviter ça ?
Message édité par vincent0 le 10-05-2005 à 18:46:35
skelter
Posté le 10-05-2005 à 18:48:37
utilises std::vector
ptitchep
Posté le 11-05-2005 à 20:07:26
Tu n'as pas définit tableau comme un tableau de pointeurs, tu ne peux donc pas faire variables[0]=new classe(???)
Tu dois pour cela faire classe *variable[256]
Si tu ne veux pas perdre de mémoire, il faut que tu alloue ton tableau de pointeurs dynamiquement lui aussi. Comme ça tu choisit la taille en fonction de tes besoins et tu peux changer cette taille.
Tu n'as pas définit tableau comme un tableau de pointeurs, tu ne peux donc pas faire variables[0]=new classe(???)
Tu dois pour cela faire classe *variable[256]
Si tu ne veux pas perdre de mémoire, il faut que tu alloue ton tableau de pointeurs dynamiquement lui aussi. Comme ça tu choisit la taille en fonction de tes besoins et tu peux changer cette taille.
Toutafé.
Tu devrais faire un truc du genre :
(les tailles supposent qu'un pointeur occupe 4 octets)
Code :
classe** variable; // alloue 1 pointeur sur un pointeur (4 octets)
variable = new classe* [N]; // alloue N pointeurs sur classe (non initialisés, N*4 octets)
for(i=0 ; i<N ; i++)
{
variable[i] = new classe(...); // alloue 1 objet type classe
}
...
for(i=0 ; i<N ; i++)
{
delete variable[i];
}
delete variable;
Publicité
Posté le 12-05-2005 à 00:00:38
skelter
Posté le 12-05-2005 à 00:07:50
une collection de pointeur, il faut que ce soit justifié
std::vector<classe> est plus pratique
casafa
Posté le 12-05-2005 à 17:33:25
Merci de vos réponses
ptitchep
Posté le 12-05-2005 à 19:32:27
Citation :
une collection de pointeur, il faut que ce soit justifié std::vector<classe> est plus pratique
Tu pourrais détailler stp?
---------------
deluser --remove-home ptitchep
skelter
Posté le 12-05-2005 à 20:17:00
c'est a toi d'expliquer pourquoi
classe** variable;
et pas
classe* variable = new classe[n];
?
ptitchep
Posté le 12-05-2005 à 20:31:36
parce que classe* variable=new classe[n]
va créer un pointeur sur un tableau de n objets de type classe, variable[0] sera un objet et non un pointeur donc impossible de faire
variable[0]=new classe(param);
alors que classe **variable
variable = new classe* [N]; va créer un tableau de N pointeurs sur des objets de type classe
et ensuite on peut faire
variable[0]=new classe(param);
...
variable[n]=new classe(param);
car variable[n] est un pointeur!
---------------
deluser --remove-home ptitchep
ptitchep
Posté le 12-05-2005 à 20:32:42
c'est quoi
std::vector<classe> ????
---------------
deluser --remove-home ptitchep
IrmatDen
Posté le 12-05-2005 à 20:37:29
C'est un tableau de classe. Jette un coup d'oeil à sa doc...
variable[0]= classe(param);
mais new[] aura deja appelé le constructeur par defaut et l'affectation crée une copie temporaire
tu peux faire
std::vector est un modele de tableau redimensionnable
std::vector<classe> variable;
variable.reserve(n); // alloue sans construire
et n push_back( class(...) ); // toujours copie temporaire
mais classe ** c'est cher payé, je ne connais pas trop C++ mais il doit bien y avoir de meilleur solutions
Message édité par skelter le 12-05-2005 à 20:41:42
ptitchep
Posté le 12-05-2005 à 21:00:23
Moi non plus je connais pas des masses C++ et il est fort possible que ta tech soit mieux.
En cours de C on m'a appris comme ça et j'ai des cours de C++ que depuis 4 semaines (ms je connaissais un peu avant) et le prof nous fait bosser comme ça...
A creuser...
---------------
deluser --remove-home ptitchep
IrmatDen
Posté le 12-05-2005 à 21:46:08
Si tu veux un tableau à 2 dimensions, utilises un vector de vector.
Avec une déclaration du type : vector< vector<int> > matrice;
Pour déclarer un tableau d'int à 2 dimensions.
C'est bien plus facile et plus sûr que les new et delete.
skelter
Posté le 12-05-2005 à 21:55:31
ouai, sauf que vector< vector<int> > si pour une matrice ca sera pas top niveau perf pour les calcul
Message édité par skelter le 12-05-2005 à 21:55:58
IrmatDen
Posté le 12-05-2005 à 22:51:12
C'était histoire de donner vie à l'exemple (j'y réfléchirais à 2 fois le prochain coup)... un dico des synonymes avec un vector de vector de string ?
NounouRs
Non parce que c pas mon pied !
Posté le 07-06-2005 à 15:58:46
j'ai besoin de faire un tableau à 3 dimensions qui contiendra des pointeurs, et peu importe les perfs, je peux utiliser un vector de vector de vector ????