2010-06-29 3 views
0

Bonjour, malheureusement, je ne suis pas très bon dans l'ensemble de la collecte des ordures. Maintenant, je ne suis pas sûr si je vais avoir des ennuis si je fais ce qui suit:Références d'objets d'échange C++/CLI entre plusieurs objets gérés gcrooted

// unmanaged Class 
class CUnmagedClass : public CCmdTarget 
{ 
    auto_gcroot<Dictionary<int, System::String^>^> m_dict; 
    auto_gcroot<SomeManagedClass^> m_managedClass; 

    // create first manage object in one gcroot 
    CUnmagedClass() 
    :dict(gcnew Dictionary<LANGID, System::String^>()) 
    {} 

    // do something with the dictionary 
    void AddData(int key, String^ value) 
    { 
     this->m_dict->Add(key, value); 
    } 

    // Method that could be called multiple times 
    void DoOtherThings(Data^ data) 
    { 
     // create a new object on every method call 
     // old object can be garbage collected 
     this->m_managedClass = gcnew SomeManagedClass(data); 
     // assign a reference to the dictionary from the other gcroot 
     this->m_managedClass->DictProp = this->m_dict; 

     this->m_managedClass->DoSomething(); 
    } 

} 

Donc ma question est, si j'écrasent la valeur this->m_managedClass et l'ancienne SomeManagedClass exemple est détruite. Le système tente-t-il de collecter l'objet dans this->m_managedClass->DictProp également parce qu'il n'est plus connecté au second gcroot ou le garbage collector est-il assez intelligent pour savoir qu'il y a une référence dans l'autre gcroot?

Répondre

1

Le système n'essaiera pas non plus de collecter this->m_managedClass->DictProp car il est assez intelligent pour savoir que cet objet est référencé par l'autre gcroot.

La raison pour laquelle le gcroot est si intelligent est qu'il enveloppe System::Runtime::InteropServices::GCHandle, qui est un descripteur dans le tas d'ordures collectées. La classe GCHandle permet à votre objet non géré de stocker ce qui est effectivement une référence gérée. En outre, même si votre objet géré est déplacé par le garbage collector, la référence GCHandle sera mise à jour pour pointer vers son nouvel emplacement.

Questions connexes