2008-11-18 9 views
0

Lorsque vous travaillez dans le monde non géré, nous devons nous assurer que nous nettoyons après nous 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 COM composants qui sont créés en utilisant CreateInstance et à Release plus tard; peut-être quelque chose comme:Gestion de la mémoire pour les composants .NET utilisés par le code non géré

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

Il est évident que nous pourrions utiliser des pointeurs intelligents et d'autres choses (en C++) mais c'est d'ailleurs le point ...

Avons-nous aussi AddRef/Release pour les objets qui sont saisis de COM composants (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 qui est exposé à du code non géré via une interface COM? Est-ce que le garbage collector sait effacer les choses ou tout doit-il être fait manuellement dans le monde non géré?

Répondre

1

CreateInstance vous donnera un objet avec un nombre de référence de 1, de sorte que vous n'avez pas besoin de AddRef il. (Le pointeur intelligent que vous avez utilisé Release l'objet quand il est détruit.) De même, les objets que vous recevez de méthodes doivent avoir le compte de référence déjà incrémenté, donc vous n'avez pas besoin de les AddRef encore, mais vous devez les Release, sauf si vous utilisez un pointeur intelligent.

Les composants COM exposés par .NET ne sont pas différents 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.