[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:
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:
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 :
Code:
inGc->AddRef(this);
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:
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 8O
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 ?