Gestion de la mémoire pour les composants .NET utilisés par le code non géré
-
08-07-2019 - |
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é?
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
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.