A propos des pointeurs.[Débutant]

A propos des pointeurs.[Débutant] - C++ - Programmation

Marsh Posté le 10-05-2005 à 17:20:23    

Bonjour,
 
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
Reply

Marsh Posté le 10-05-2005 à 17:20:23   

Reply

Marsh 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 :o

Reply

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

Reply

Marsh 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

---------------
http://www.blastmanu.info
Reply

Marsh Posté le 10-05-2005 à 18:25:19    

vincent0 a écrit :

Merci...
L'instruction "delete[] variable;" permet de libérer tous les pointeurs non initialisés ?


 
ca detruit une collection d'objets et libere l'emplacement pointé par 'variable'

Reply

Marsh Posté le 10-05-2005 à 18:38:20    

vincent0 a écrit :


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

Reply

Marsh 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
Reply

Marsh Posté le 10-05-2005 à 18:48:37    

utilises std::vector

Reply

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


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 12-05-2005 à 00:00:38    

ptitchep a écrit :

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 :
  1. classe** variable; // alloue 1 pointeur sur un pointeur (4 octets)
  2. variable = new classe* [N]; // alloue N pointeurs sur classe (non initialisés, N*4 octets)
  3. for(i=0 ; i<N ; i++)
  4. {
  5.   variable[i] = new classe(...);  // alloue 1 objet type classe
  6. }
  7. ...
  8. for(i=0 ; i<N ; i++)
  9. {
  10.   delete variable[i];
  11. }
  12. delete variable;


Reply

Marsh Posté le 12-05-2005 à 00:00:38   

Reply

Marsh Posté le 12-05-2005 à 00:07:50    

une collection de pointeur, il faut que ce soit justifié
std::vector<classe> est plus pratique

Reply

Marsh Posté le 12-05-2005 à 17:33:25    

Merci de vos réponses

Reply

Marsh 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
Reply

Marsh Posté le 12-05-2005 à 20:17:00    

c'est a toi d'expliquer pourquoi
classe** variable;
et pas
classe* variable = new classe[n];
 
?

Reply

Marsh 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
Reply

Marsh Posté le 12-05-2005 à 20:32:42    

c'est quoi
std::vector<classe>  
????


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 12-05-2005 à 20:37:29    

C'est un tableau de classe. Jette un coup d'oeil à sa doc...

Reply

Marsh Posté le 12-05-2005 à 20:41:13    

ptitchep a écrit :

c'est quoi
std::vector<classe>  
????


 
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
Reply

Marsh 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
Reply

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

Reply

Marsh 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
Reply

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

Reply

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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