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?

È stato utile?

Soluzione

CreateInstance restituirà un oggetto con un numero di riferimento di 1, quindi non è necessario AddRef . (Il puntatore intelligente che hai usato Rilascio l'oggetto quando viene distrutto. Allo stesso modo, gli oggetti che ricevi dai metodi dovrebbero avere il conteggio dei riferimenti già incrementato, quindi non è necessario AddRef di nuovo - ma devi Rilascia , a meno che tu non stia utilizzando un puntatore intelligente.

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top