implémentation très malheureuse de pointeurs intelligents

implémentation très malheureuse de pointeurs intelligents - C++ - Programmation

Marsh Posté le 20-12-2003 à 18:11:50    

Voila, ceci est un petit exemple de garbage collector, j'espère que ca pourra aider certains et lever des critiques d'autres :p
 
gc.h

Code :
  1. #ifndef gc_h
  2. #define gc_h
  3. namespace gc
  4. {
  5. // cette classe doit servir de classe mère à tous les objets devant profiter du gc
  6. // il sert au polymorphisme de la liste de références
  7. class gcObject
  8. {
  9. };
  10. template<typename T>
  11. class gcRef
  12. {
  13.  T ref;
  14.  void Inc()
  15.  {
  16.   if(ref != 0)
  17.    ++(listrefs[ref]);
  18.  }
  19.  void Dec()
  20.  {
  21.   if(ref != 0)
  22.   {
  23.    --(listrefs[ref]);
  24.    if(listrefs[ref] == 0)
  25.    {
  26.     listrefs.erase(ref);
  27.     delete ref;
  28.    }
  29.   }
  30.  }
  31. protected:
  32.  // clé : pointeur vers l'objet, valeur : nombre de références à l'objet
  33.  static std::map<gcObject*, unsigned long> listrefs;
  34. public:
  35.  gcRef()
  36.   :ref(0)
  37.  {
  38.  }
  39.  gcRef(const gcRef<T> & source)
  40.   : ref(source.ref)
  41.  {
  42.   Inc();
  43.  }
  44.  gcRef(const T & source)
  45.   : ref(source)
  46.  {
  47.   Inc();
  48.  }
  49.  gcRef<T> & operator = (const gcRef<T> & source)
  50.  {
  51.   Dec();
  52.   ref = source.ref;
  53.   Inc();
  54.   return *this;
  55.  }
  56.  T & operator = (const T & source)
  57.  {
  58.   Dec();
  59.   ref = source;
  60.   Inc();
  61.   return ref;
  62.  }
  63.  ~gcRef()
  64.  {
  65.   Dec();
  66.  }
  67.  T & operator -> ()
  68.  {
  69.   return ref;
  70.  }
  71.  const T & operator -> () const
  72.  {
  73.   return ref;
  74.  }
  75. };
  76. template<typename T>
  77. std::map<gcObject*, unsigned long> gcRef<T>::listrefs;
  78. }
  79. #endif


 
test.cpp

Code :
  1. #include <iostream>
  2. #include <map>
  3. #include "gc.h"
  4. using namespace std;
  5. struct A : gc::gcObject
  6. {
  7. A() { cout << "A()" << endl; }
  8. ~A() { cout << "~A()" << endl; }
  9. public:
  10. int val;
  11. };
  12. gc::gcRef<A*> func2()
  13. {
  14. gc::gcRef<A*> test = new A();
  15. test->val = 3;
  16. return test;
  17. }
  18. void func()
  19. {
  20. gc::gcRef<A*> test = func2();
  21. cout << test->val;
  22. }
  23. void main()
  24. {
  25. func();
  26. }


Message édité par blackgoddess le 20-12-2003 à 18:21:53

---------------
-( BlackGoddess )-
Reply

Marsh Posté le 20-12-2003 à 18:11:50   

Reply

Marsh Posté le 20-12-2003 à 18:14:44    

désolé, mais ça n'a rien d'un garbage collector. c'est juste une implémentation pas très heureuse (edit: très malheureuse en fait) de pointeurs intelligents. voir boost::shared_ptr et consors


Message édité par Taz le 20-12-2003 à 18:18:40
Reply

Marsh Posté le 20-12-2003 à 18:21:38    

j'ai pas du bien comprendre ce qu'etait un garbage collector alors : c quoi ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 21-12-2003 à 11:06:24    

j'ai vu dans mon implémentation des std::auto_ptr qu'ils utilisent des reinterpret_cast plutot que le polymorphisme pour les pointeurs, je suppose que c'est mieux car ca evite d'etre obligé de tout dériver d'une classe de base.
 
sinon sont aussi implémenté l'opérateur *, et un operateur de transtypage


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 21-12-2003 à 12:58:19    

1) les std::auto_ptr sont trop limités et n'ont pas une sémantique complète et compatible STL
2) rien compris

Reply

Marsh Posté le 01-01-2004 à 14:48:25    

Bonne Année 2004 !  :hello:  
 
Toujours pareil, je comprends rien a votre style de programmation ! [:airforceone] Je vais faire un effort pour decrypter le code de BlackGoddess...
 
Par ailleurs, je recherche un "leak detector" simple. En modifiant ton code, est-il envisageable d'obtenir ce que je recherche ? Je perds environ 15ko (sic!) de mémoire à chaque fois qu'une connection client TCP/IP est acceptée. Ca monte vite même avec bcp de barettes mémoire dans la bécane.  
 
Cordialement,  
   Xterm-in'Hate.
 
-edit-
PS: Je connaissais pas STL, je viens tout juste de comprendre...:jap:


Message édité par xterminhate le 01-01-2004 à 15:13:47
Reply

Marsh Posté le 01-01-2004 à 16:11:52    

bref tu connaissais pas grand chose du C++ ... (STL étant un bon exemple de mise en oeuvre)
 
sous Linux, tu as valgrind ou memprof
Bye

Reply

Sujets relatifs:

Leave a Replay

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