IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[C++ natif] Impl�mentation d'un garbage collector


Sujet :

C++

  1. #1
    Membre �clair�
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Par d�faut [C++ natif] Impl�mentation d'un garbage collector
    Bonjour,
    voil�, je me suis fait un Garbage Collector pour une application native C++ mais j'ai un l�ger probl�me de changement d'adresse sur le pointeur this.
    L'id�e de mon Garbage Collectore est d'en faire un template de classe dont tous les classes l'utilisant seront contraintes d'impl�menter une interface (sans m�thode) IGcObject.

    Voici le code :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    interface IGcObject
    {
    };
     
    template<class X> class CGarbageCollector
    {
    public :
    	CGarbageCollector () 
    	{
    	};
     
    	void Purge () 
    	{
    		POSITION pos = m_ObjectListToRelease.GetHeadPosition();
    		while (pos)
    		{
    			X* elementtodelete = m_ObjectListToRelease.GetNext(pos);
    			delete elementtodelete;
    		}
    	};
     
    	~CGarbageCollector () 
    	{
    	};
     
    public :
    	void AddRef (X* inObject)
    	{
    		m_ObjectListToRelease.AddHead(inObject);
    	};
    private :
    	CList<X*, X*> m_ObjectListToRelease;
    };
     
    class UseGrab1 : public IGcObject
    {
    public :
    	explicit UseGrab1 (CGarbageCollector<IGcObject>* inGc)
    	{
    		inGc->AddRef(this);
    	};
    	virtual ~UseGrab1()
    	{
    	};
    };
    Et l'utilisation � titre d'exemple :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    			UseGrab1* _g1_1 = new UseGrab1(&mygarbagecollector);
    			UseGrab1* _g1_2 = new UseGrab1(&mygarbagecollector);
    			UseGrab2* _g2_1 = new UseGrab2(&mygarbagecollector);
    			mygarbagecollector.Purge ();
    Le petit probl�me vient du passage du constructeur de mes objets _g1_1, _g1_2 et _g1_3 � la m�thode AddRef() de mon Garbage Collector.
    Le probl�me est le suivant, je vais en debug dans le constructeur de UseGrab1, j'ai donc dans ma Call Stack :
    Je regarde l'adresse de mon pointeur this et je trouve la valeur 0x00a37F78 et d�s que je passe dans la m�thode AddRef de mon Garbage Collector :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    	void AddRef (X* inObject)
    	{
    		m_ObjectListToRelease.AddHead(inObject);
    	};
    Je me retrouve avec l'adresse de inObject valant 0x00a37F7c.
    Et ainsi de suite pour chaque objet, mon adresse de pointeur sur l'objet courant augmente de 4 bits
    Au d�but, je pensais que comme �tant dans mon constructeur, mon objet n'�tait pas encore finalis�, j'ai donc appel� la m�thode AddRef depuis une autre m�thode de ma classe UseGrab1, m�me r�sultat, mon adresse de pointeur this augmente de 4 bits, j'avoue que j'ai fait le tour du probl�me et je ne vois pas trop ce qui se passe.
    Une id�e svp ?

  2. #2
    Membre �clair�
    Avatar de gb_68
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Ao�t 2006
    Messages
    232
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2006
    Messages : 232
    Par d�faut
    Bonjour,

    je pense qu'a l'adresse 0 de ton objet se trouve son trouve son pointeur vers sa table des fonctions virtuelles (car il poss�de des m�thodes virtuels). Apr�s (soit 4 bits plus loin) viennent ses membres h�rit�s, dont en premier IGcObject (m�me si cette classe est vide, elle d�bute donc � l'adresse this + 4 bits).

    Ensuite dans
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    	explicit UseGrab1 (CGarbageCollector<IGcObject>* inGc)
    	{
    		inGc->AddRef(this);
    	};
    le fait que ce soit un template est inutile ici ; cela �quivaut �
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    	explicit UseGrab1 (CGarbageCollector<IGcObject>* inGc)
    	{
    		inGc->AddRef<IGcObject>(this);
    	};
    donc this sera transtyp� en IGcObject (soit this+4).

  3. #3
    Membre �clair�
    Avatar de gb_68
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Ao�t 2006
    Messages
    232
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2006
    Messages : 232
    Par d�faut
    En fait ton garbage contient uniquement des IGcObject, donc
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	void Purge () 
    	{
    		POSITION pos = m_ObjectListToRelease.GetHeadPosition();
    		while (pos)
    		{
    			X* elementtodelete = m_ObjectListToRelease.GetNext(pos);
    			delete elementtodelete;
    		}
    	};
    �quivaut �
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	void Purge () 
    	{
    		POSITION pos = m_ObjectListToRelease.GetHeadPosition();
    		while (pos)
    		{
    			IGcObject * elementtodelete = m_ObjectListToRelease.GetNext(pos);
    			delete elementtodelete;
    		}
    	};
    un delete est fait sur un IGcObject (appel de son destructeur par d�faut auto g�n�r�) au lieu d'�tre fait sur l'objet complet.

    Une solution : (voir FAQ C++ sur destructeurs)
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    class IGcObject {
    virtual ~IGcObject () {};
    };

  4. #4
    Membre �clair�
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Par d�faut
    OK, merci pour ces r�ponses.
    En effet, je m'�tais plant� dans la d�claration de template dans les objets l'utilisant.
    Par contre, un probl�me me vient � l'esprit car je n'avais jamais utilis� auparavant de template sur interface ou classe abstraite, est-ce possible ou bien le type d'objet sur lequel s'appuie le template doit �tre connu � la compil ? Il me semblerait malheureusement que oui

  5. #5
    Membre �clair�
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Par d�faut
    Bon, apparement, contrairement � java, impossible de faire des Vector<>, List<> ... � partir d'une interface commune, je suis d��u.
    Je vais me faire une classe GC dont h�riteront mes autres classes, je trouve �a un peu pourri mais je vois pas d'autre solution

  6. #6
    Alp
    Alp est d�connect�
    Expert confirm�

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 36
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par d�faut
    Si c'est possible, seulement pour b�n�ficier du polymorphime il faut utiliser des r�f�rences ou des pointeurs dans tes conteneurs.

  7. #7
    Membre �clair�
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Par d�faut
    Citation Envoy� par Alp
    Si c'est possible, seulement pour b�n�ficier du polymorphime il faut utiliser des r�f�rences ou des pointeurs dans tes conteneurs.
    En effet, je viens de m'en rendre compte

Discussions similaires

  1. [JVM] Java 5 et Garbage Collector(Parralèle)
    Par ssaunois dans le forum G�n�ral Java
    R�ponses: 6
    Dernier message: 28/11/2005, 23h42
  2. [JVM]Garbage collector
    Par godik dans le forum G�n�ral Java
    R�ponses: 5
    Dernier message: 07/10/2005, 09h12
  3. JPanel et Garbage Collector
    Par tck-lt dans le forum Agents de placement/Fen�tres
    R�ponses: 9
    Dernier message: 25/07/2005, 18h03
  4. [JVM] les objets et le Garbage collector
    Par Kurdran dans le forum G�n�ral Java
    R�ponses: 7
    Dernier message: 02/06/2005, 16h57
  5. [Language]Garbage collector
    Par GETah dans le forum Langage
    R�ponses: 2
    Dernier message: 23/03/2005, 15h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo