Frage

Bei der Arbeit in der nicht verwalteten Welt müssen wir sicherstellen, dass wir nach uns selbst aufräumen, wenn wir dem Haufen Gedächtnis zugewiesen haben (z. B. durch die Verwendung der new Schlüsselwort in C ++); Wir müssen auch sicherstellen, dass wir AddRef COM -Komponenten, die erstellt werden, mithilfe CreateInstance und zu Release es später; Vielleicht so etwas wie:

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

Offensichtlich könnten wir intelligente Zeiger und andere solche Dinge (in C ++) verwenden, aber das ist nicht der Punkt ...

Müssen wir auch AddRef/Release Für Objekte, die aus COM -Komponenten abgeholt werden (wie m_anotherobj im obigen Beispiel)?

Was passiert, wenn diese bestimmte Komponente, die tatsächlich eine .NET -Komponente ist, die über eine COM -Schnittstelle nicht verwaltet ist, wenn diese bestimmte Komponente tatsächlich eine .NET -Komponente ausgesetzt ist? Kennt der Müllsammler, um Sachen aufzuräumen, oder muss alles manuell in der nicht verwalteten Welt erledigt werden?

War es hilfreich?

Lösung

CreateInstance gibt Ihnen ein Objekt mit einer Referenzzahl von 1 zurück, sodass Sie nicht müssen AddRef es. (Der intelligente Zeiger, den Sie verwendet haben, wird Release Das Objekt, wenn es zerstört wird.) In ähnlicher Weise sollten Objekte, die Sie aus Methoden erhalten AddRef sie wieder - aber du musst Release Sie, es sei denn, Sie verwenden einen intelligenten Zeiger.

COM -Komponenten, die von .NET ausgesetzt sind, unterscheiden sich nicht von COM -Komponenten, die von einer anderen Technologie geschrieben wurden. Der Müllsammler sammelt keine .NET -Objekte, auf die aus COM -Referenzen verwiesen wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top