Speicherverwaltung für .NET -Komponenten, die mit nicht verwaltetem Code verwendet werden
-
08-07-2019 - |
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?
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.