Gestione della memoria per componenti .NET utilizzati da codice non gestito
-
08-07-2019 - |
Domanda
Quando lavoriamo nel mondo non gestito, dobbiamo assicurarci di ripulire dopo noi stessi se abbiamo allocato memoria sull'heap (ad esempio utilizzando la parola chiave new
in C ++); dobbiamo anche assicurarci di AddRef
componenti COM creati utilizzando CreateInstance
e di Rilasciare
in un secondo momento; forse qualcosa del tipo:
SomeNameSapce::IObjPtr obj;
HRESULT hr = obj.CreateInstance(L"SomeObject");
if (hr == S_OK)
{
obj->AddRef();
m_anotherObj= obj->GetObj();
obj->Release();
}
Ovviamente potremmo usare puntatori intelligenti e altre cose simili (in C ++) ma questo è oltre al punto ...
Dobbiamo anche AddRef / Release
per oggetti catturati da componenti COM (come m_anotherObj nell'esempio sopra)?
Per rendere le cose più confuse, cosa succede se questo particolare componente che è in realtà un componente .NET che viene esposto a codice non gestito tramite un'interfaccia COM? Il garbage collector sa come eliminare le cose o tutto deve essere fatto manualmente nel mondo non gestito?
Soluzione
CreateInstance
restituirà un oggetto con un numero di riferimento di 1, quindi non è necessario AddRef
. (Il puntatore intelligente che hai usato
I componenti COM esposti da .NET non sono diversi dai componenti COM scritti da qualsiasi altra tecnologia. Il garbage collector non raccoglierà alcun oggetto .NET a cui si fa riferimento dai riferimenti COM.