Question

Lorsque vous travaillez dans un monde non géré, nous devons nous assurer de nettoyer après nous-mêmes si nous avons alloué de la mémoire sur le tas (par exemple, en utilisant le mot clé new en C ++); nous devons également nous assurer que nous AddRef des composants COM créés à l'aide de CreateInstance et que le relâche ultérieurement; peut-être quelque chose comme:

SomeNameSapce::IObjPtr obj;
HRESULT hr = obj.CreateInstance(L"SomeObject");
if (hr == S_OK)
{
    obj->AddRef();
    m_anotherObj= obj->GetObj();
    obj->Release();
}

Évidemment, nous pourrions utiliser des pointeurs intelligents et autres choses similaires (en C ++), mais c’est d’autre part le point ...

Devons-nous également AddRef / Release pour les objets saisis à partir de composants COM (comme m_anotherObj dans l'exemple ci-dessus)?

Pour rendre les choses plus confuses, que se passe-t-il si ce composant particulier qui est en fait un composant .NET exposé à du code non managé via une interface COM? Est-ce que le ramasse-miettes sait comment nettoyer les choses ou est-ce que tout doit être fait manuellement dans le monde non géré?

Était-ce utile?

La solution

CreateInstance vous restituera un objet avec un nombre de références égal à 1, vous n'avez donc pas besoin de le AddRef . (Le pointeur intelligent que vous avez utilisé Publiera lorsqu'il sera détruit.) De même, le nombre de références des objets que vous recevez de méthodes doit déjà être incrémenté. AddRef à nouveau - mais vous devez Valider , sauf si vous utilisez un pointeur intelligent.

Les composants COM exposés par .NET ne diffèrent pas des composants COM écrits par une autre technologie. Le garbage collector ne collectera aucun objet .NET référencé à partir de références COM.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top