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
?