Zerstören des COM-Objekts in Delphi

7

Lassen Sie eine .net-Assembly in Delphi über COM aufrufen.

%Vor%

Muss ich etwas tun, um es zu zerstören, um Speicher freizugeben. Oder nicht?

    
Jack Malkovich 25.06.2011, 04:44
quelle

4 Antworten

6

Sie sollten den Speicher besser mit

freigeben %Vor%

Wenn Sie es nicht mehr brauchen. Besser mit einem try...finally intf := nil; -Block oder in der Destroy überschriebenen Methode, wenn intf als fIntf definiert ist, d. H. Als Klasseneigenschaft.

Wenn intf auf dem Stack definiert ist, werden wir am Ende der Methode automatisch freigegeben. Es gibt einen versteckten try...finally intf := nil; end -Block, der vom Compiler generiert wurde, um die intf -Instanz freizugeben.

    
Arnaud Bouchez 25.06.2011, 06:53
quelle
12

COM-Objekte sind Referenzzähler, und sie werden automatisch zerstört, wenn der Referenzzähler Null erreicht. Der Compiler fügt den Methoden _AddRef und _Release interface automatisch Aufrufe hinzu, wenn der Code einen Verweis auf das Objekt hinzufügt oder entfernt. Das Setzen einer Variable, die auf ein COM-Objekt auf nil verweist, ruft _Release auf (dekrementiert die Referenzzählung), und wenn die Referenzzählung Null erreicht, wird das Objekt ebenfalls freigegeben (dies ist nicht der Fall, wenn die Referenzzählung nicht null ist). Wenn eine Variable den Gültigkeitsbereich verlässt (d. H. Eine lokale Variable, wenn die Prozedur beendet wird), ruft der Compiler auch _Release auf, wenn die Variable auf ein COM-Objekt (oder eine Referenz-gezählte Delphi-Schnittstelle) verweist.

    
user160694 25.06.2011 11:07
quelle
6

Alle COM-Schnittstellen müssen IUnknown :

implementieren %Vor%

IUnknown stellt zwei Dienste bereit. Zuallererst ermöglicht QueryInterface Clients, die anderen Schnittstellen zu erhalten, die das Objekt implementieren kann. Der zweite Dienst ist der der Lebenszeitverwaltung.

Jedes Mal, wenn Sie eine Referenz auf ein COM-Objekt nehmen, müssen Sie _AddRef aufrufen. Jedes Mal, wenn Sie einen Verweis auf ein COM-Objekt aufgeben, müssen Sie _Release aufrufen.

Die kanonische Implementierung von _AddRef und _Release ist für das implementierende Objekt, um eine Referenzzählvariable zu pflegen, die inkrementiert und dekrementiert wird, wenn Referenzen genommen und freigegeben werden. Wenn ein Aufruf von _Release diesen Verweiszähler auf 0 setzt, zerstört sich das Objekt selbst.

Die Delphi-Implementierung von Schnittstellen verwaltet die Aufrufe von _AddRef und _Release in Ihrem Auftrag. Wenn Sie eine Schnittstellenvariable zuweisen, gibt der Compiler folgenden Code aus:

  • Ruft _Release auf der Schnittstelle auf, auf die sich die Variable zuvor bezog, wenn sie sich vorher tatsächlich auf etwas bezog.
  • Ruft _AddRef für die Schnittstelle auf, auf die sich die Variable bezieht.

Der Compiler sorgt auch dafür, dass _Release aufgerufen wird, wenn die Variable den Bereich verlässt.

Dies bedeutet, dass Sie keine besonderen Maßnahmen ergreifen müssen, um sicherzustellen, dass Ihre COM-Objekte zerstört werden. Sie werden natürlich zerstört, wenn die letzte Referenz auf das Objekt den Geltungsbereich verlässt.

Wenn Sie jedoch ein Objekt vorzeitig zerstören möchten, weisen Sie nil einfach der Variablen zu, die die Schnittstelle enthält. Beachten Sie, dass dies natürlich voraussetzt, dass keine anderen Referenzen auf diese Schnittstelle gehalten werden.

    
David Heffernan 25.06.2011 13:46
quelle
2

Das Objekt wird automatisch freigegeben. Wenn Sie jedoch den Verweis, den die Variable intf enthält, explizit freigeben möchten, können Sie ihn auf Null setzen.

    
Frederik Slijkerman 25.06.2011 12:49
quelle

Tags und Links