Question bête sur "new"

Question bête sur "new" - C++ - Programmation

Marsh Posté le 08-02-2007 à 09:04:05    

Bonjour,
 
Une petite question qui va vous sembler bête mais je ne trouve pas de vraie réponse sur le net.
Quel est l'intéret d'instancier une classe en utilisant le mot clé new ?
 
Voilà, ca se résume à ca :D

Reply

Marsh Posté le 08-02-2007 à 09:04:05   

Reply

Marsh Posté le 08-02-2007 à 10:22:16    

Le fait est que new a rapport avec la classe d'allocation d'un objet et pas avec sa construction.

Reply

Marsh Posté le 08-02-2007 à 10:25:34    

Taz a écrit :

Le fait est que new a rapport avec la classe d'allocation d'un objet et pas avec sa construction.


tu peux développer, je saisis pas la différence ....

Reply

Marsh Posté le 08-02-2007 à 11:30:22    

La personne qui t'as appris new ne te l'a pas dit ?

Reply

Marsh Posté le 08-02-2007 à 11:34:44    

Taz a écrit :

La personne qui t'as appris new ne te l'a pas dit ?


non, sinon je demanderais pas :D
 (ou alors il l'a dit mais pas avec tes mots)
 
Tu sais, les profs ...

Reply

Marsh Posté le 08-02-2007 à 11:44:56    

did-54 a écrit :

Tu sais, les profs ...


On est pas encore vendredi :o


---------------
Töp of the plöp
Reply

Marsh Posté le 08-02-2007 à 11:52:05    

bref, faut répondre là normalement :D
 
han, vous savez pas en fait :o

Reply

Marsh Posté le 08-02-2007 à 12:00:45    

Reply

Marsh Posté le 08-02-2007 à 12:10:11    

http://en.wikipedia.org/wiki/Operator_new
 
New est un opérateur qui permet l'allocation dynamique de mémoire sur le tas ...
 

Code :
  1. Lapin blob (nom, age, nbOreilles); //crée un Lapin sur la pile (variable locale)
  2. Lapin *zorg=new Lapin [50]; //crée un tableau de 50 lapins sur le tas (qui ne sont pas détruits à la fin de la fonction/méthode)
  3. ...
  4. delete [] zorg; //destruction du tableau lapin (sinon fuite de mémoire)



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

Marsh Posté le 08-02-2007 à 12:12:25    

http://fr.wikipedia.org/wiki/Alloc [...] C3%A9moire


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

Marsh Posté le 08-02-2007 à 12:12:25   

Reply

Marsh Posté le 08-02-2007 à 12:29:07    

Ok, c'est ce que j'avais compris, mais en pratique, quel est l'intéret d'allouer sur le tas  ?
 
Parceque si je fais jamais de delete, j'ai une fuite de mémoire non ?


Message édité par did-54 le 08-02-2007 à 12:29:34
Reply

Marsh Posté le 08-02-2007 à 12:30:40    

ben non t'as pas compris ni lu.

Reply

Marsh Posté le 08-02-2007 à 12:34:38    

Taz a écrit :

ben non t'as pas compris ni lu.


je viens de le faire,
 
j'ai compris que l'allocation sur le tas permet de conserver notre objet en mémoire même en dehors de la méthode dans laquelle il est instancié. Le problème étant qu'on est ensuite responsable de la désallocation (ce qui n'est pas le cas lors de l'allocation sur la pile).
 
Mais ce que je ne vois pas, c'est un cas concret qui me forcerait à faire ca, avec tous les risques que ca comporte.

Reply

Marsh Posté le 08-02-2007 à 12:43:55    

did-54 a écrit :


Mais ce que je ne vois pas, c'est un cas concret qui me forcerait à faire ca, avec tous les risques que ca comporte.


 

Code :
  1. int main ()
  2. {
  3.      int nbLapins;
  4.      Lapin* lapins=NULL;
  5.      cout<<"Combien de lapins voulez-vous créer? ";
  6.      cin>>nbLapins;
  7.      if (nbLapins>0)
  8.           lapins=new Lapin[nbLapins];
  9.      ...
  10.      if (lapins!=NULL)
  11.           delete [] lapins;
  12.      return 0;
  13. }


 
 
 
 


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

Marsh Posté le 08-02-2007 à 12:56:18    

oui pour un tableau, mais pour un objet seul ?

Reply

Marsh Posté le 08-02-2007 à 13:17:54    

did-54 a écrit :

oui pour un tableau, mais pour un objet seul ?


 

Code :
  1. Lapin* Lapin::seReproduire (Lapin& male)
  2. {
  3.       ... (censuré)
  4.       Lapin* nouveauPetit=new Lapin (nom,age,nbOreilles);
  5.       petitsAAllaiter.push_back(nouveauPetit);
  6.       return nouveauPetit ;
  7. }
  8. void Elevage::gerer()
  9. {
  10.      Lapin male ("blob",3,1.5);
  11.      Lapin femelle ("blib",3,1.5);
  12.    
  13.      Lapin *petit1=femelle.seReproduire(male);
  14.      ...
  15. }


 
dans cet exemple la femelle donne un petit qu'elle conserve dans petitsAAllaiter et renvoie le pointeur du petit à l'Elevage pour qu'il puisse le connaitre aussi.
Comme ça, un seul petit est créé, mais l'éleveur et sa mère le connaissent.
 
ça répond à la question?


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

Marsh Posté le 08-02-2007 à 13:48:16    

Oui, merci :)

Reply

Marsh Posté le 08-02-2007 à 14:05:26    

ca fait pas beaucoup d'oreilles, ca http://smileys.sur-la-toile.com/repository/Basse_cour/lapin.gif


Message édité par lorill le 08-02-2007 à 14:08:08
Reply

Marsh Posté le 08-02-2007 à 14:43:15    

Exemple pas forcément pertinent.
 
Un exemple pertinent : instancier conditionnellement un objet. Par exemple pour une relation de 0-1

Reply

Marsh Posté le 08-02-2007 à 14:55:48    

Taz a écrit :

Exemple pas forcément pertinent.
 
Un exemple pertinent : instancier conditionnellement un objet. Par exemple pour une relation de 0-1


 
ben c'était un exemple vite fait d'où le:

ptitchep a écrit :


ça répond à la question?


 
mon premier exemple n'est pas une instanciation conditionnelle? Je crée le tableau (ou pas) selon des paramètres (ici l'entrée au clavier).
 
c'est a dire: une relation de 0-1?


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

Marsh Posté le 10-02-2007 à 21:20:45    

En tout cas... l'exemple des lapins est terrible... :foudtag:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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