2012-11-16 10 views
7

Ich verwende ComPtr (Microsoft :: WRL), um einige DirectX11-Ressourcen zu verwalten. Wie kann ich es manuell freigeben?ComPtr manuell freigeben

Die „ReleaseAndGetAddressOf“ Methode, wenn ich richtig verstehe, befreit nur den Zeiger und nicht die Ressource selbst (die zurückgegeben wird), und ich bin über die „Reset“ Methode nicht sicher.

Die einzigen Alternativen, die ich denken konnte, sind manuell den Zeiger Destruktor aufrufen, oder nach dem Erhalt der rohen Zeiger von "ReleaseAndGetAddressOf" Aufruf "Release" auf, die ich gerne vermeiden würde.

+0

Ihre Beschreibung von ReleaseAndGetAddressOf() ist falsch. Es gibt die Ressource frei und gibt die Adresse des umbrochenen Zeigers zurück, wo Sie einen anderen Zeigerwert speichern könnten. "Das Freigeben auf diesem" sollte geschrieben werden "Freigeben auf einem jetzt-hingenden Zeiger, um mein Programm zum Absturz zu bringen". –

Antwort

16

Der Quellcode für WRL wird zur Verfügung gestellt, werfen Sie einen Blick auf include/winrt/wrl/client.h. Der eingebettete COM-Zeiger (ptr_ member) wird von der Funktion InternalRelease() freigegeben. Machen Sie eine der folgenden Weise die Zeiger geeignete Kandidaten zu lösen:

  • die destructor. Der Grund ComPtr zu verwenden <>
  • Zuordnung nullptr
  • ReleaseAndGetAddressOf() verwendet, der lange Weg um
  • Aufruf-Reset()

So nullptr zuweisen oder Aufruf Reset() ist eine gute Passform, Treffen Sie Ihre Wahl. Oder verwenden Sie es überhaupt nicht, wenn Sie nur den Schnittstellenzeiger selbst verwalten wollen, ist es sicherlich nicht erforderlich, ComPtr zu verwenden.

+0

Vielen Dank für die ausführliche Erklärung. Ich profitiere tatsächlich von der Verwendung eines intelligenten Zeigers, aber in einigen Fällen muss ich die interne Ressource entladen, während ich die Wrapper-Klasse beibehalte. –

+0

ReleaseAndGetAddressOf() -> Release() nicht sogar kompilieren. (* instance.ReleaseAndGetAddressOf()) -> Release() ist ein Absturz. Entfernen Sie es aus Ihrer Antwort. –

3

Sie können einen Nullzeiger zuweisen.

+0

Danke, so einfach wie ich es mir erhofft habe! –