[STL] list, push_back et ses joyeux amis... Je comprends pas tout

list, push_back et ses joyeux amis... Je comprends pas tout [STL] - C++ - Programmation

Marsh Posté le 01-06-2003 à 20:32:56    

Bon, je me met tout doucement à la STL, et j'ai un peu de mal...
 
J'ai une classe A du style:

Code :
  1. class A
  2. {
  3.     public:
  4.         string Nom; 
  5.        
  6.         A(void);
  7.         virtual ~A();
  8. };
  9. A::A()
  10. {
  11.   Nom = "";
  12.   cout << ">Creation A().    Adresse object:" << this << " Valeur Nom:" << Nom << endl;
  13. }
  14. A::~A()
  15. {
  16.   cout << "<Destruction A(). Adresse object:" << this << " Valeur Nom:" << Nom << endl;
  17. }


Avant ca, j'ai mes includes qui vont bien:

Code :
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <list>
  4. using namespace std;


et le main suivant:

Code :
  1. int main(int argc, char *argv[])
  2. {
  3.   list<A> maListe;
  4.  
  5.   // Creation objet  
  6.   A *test = new A;
  7.   test->Nom = "Test1";
  8.    
  9.   delete test;
  10.   system("PAUSE" );
  11.   return 0;
  12. }


Et ca me donne le résultat suivant:

>Creation A().    Adresse object:0x3d3e88 Valeur Nom:
<Destruction A(). Adresse object:0x3d3e88 Valeur Nom:Test1


Jusqu'ici, rien de bien sorcier, c'est normal que tout marche bien.
J'ai bien les mêmes adresses.
Là ou je capte plus c'est que si je fais un  

Code :
  1. maListe.push_back(*test);  maListe.clear();

à la place de

Code :
  1. delete test;

, et bien ca me donne le résultat suivant:

>Creation A().    Adresse object:0x3d3e88 Valeur Nom:
<Destruction A(). Adresse object:0x3d2448 Valeur Nom:Test1


Note: je fais un maListe.clear() pour que ca s'affiche avant que le programme quitte, sinon on a pas le temps de voir le cout... En remplacant les cout par des MessageBox dans la classe A et sans le maListe.clear() dans le main(), le résultat est le même car le destructeur est appelé quand l'objet list est détruit...
 
Donc ma question est la suivante: pourquoi l'adresse de mon objet A est modifiée quand je l'ajoute à la liste ???


Message édité par spark le 01-06-2003 à 20:34:08
Reply

Marsh Posté le 01-06-2003 à 20:32:56   

Reply

Marsh Posté le 01-06-2003 à 20:35:18    

Désolé si je reponds pas pendant qq heures, je dois partir.
Merci à celui qui m'expliquera pourquoi ca fait ca, ou bien où je me trompes. :D

Reply

Marsh Posté le 01-06-2003 à 20:39:55    

par ce que les conteneur C++ contiennent des copies! fait ton operateur de copie et tu veras. d'ailleurs tu passe toit meme un Truc et pas un Truc*
 
quel interet de passé par un new/delete
 
 
edit: et pas besoin de clear non pus


Message édité par Taz le 01-06-2003 à 20:41:24
Reply

Marsh Posté le 01-06-2003 à 20:43:26    

Et remet le delete sinon ça fuit :D

Reply

Marsh Posté le 02-06-2003 à 00:32:11    

++Taz a écrit :

par ce que les conteneur C++ contiennent des copies! fait ton operateur de copie et tu veras. d'ailleurs tu passe toit meme un Truc et pas un Truc*
 
quel interet de passé par un new/delete
 
 
edit: et pas besoin de clear non pus


ok, je savais pas que c'était des copies :D Je vais voir ca...

Reply

Marsh Posté le 02-06-2003 à 00:41:51    

Donc si j'ai bien compris, je fais un object test genre

Code :
  1. A test;
  2. test.Nom = "Test1";
  3. maListe.push_back(test);


ca me créé mon objet test normalement, et vu que c'est plus en dynamique, les constructeur et destructeurs sont appelés automatiquements.
Ensuite, en faisant un push_back(test), ca ajoute un nouvel élément test' identique à test mais à une adresse différente (forcément) et son propre destructeur (donc, derriere il doit faire un memcpy de test dans test').
Donc, j'aurai l'appel de 2 destructeurs. celui de test et test'
C'est bien comme ca que ca marche ? :)

Reply

Marsh Posté le 02-06-2003 à 06:55:02    

toi t'as fait du C... y a pas de memcpy, y a création d'un nouvel objet avec l'opérateur de recopie synthétisé qui procède à une recopie membre à membre. achète toi un vrai bouquin de C++ avant d'attaquer STL, par ce que là, c'est assez désastreux

Reply

Sujets relatifs:

Leave a Replay

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