Einzelnen Beitrag anzeigen

Thebe

Registriert seit: 25. Jul 2004
Ort: Wedel
78 Beiträge
 
Delphi 6 Enterprise
 
#7

Re: Freigabe eines Objektes wenn keine Referenz mehr drauf z

  Alt 30. Sep 2005, 16:21
Soo
ich hab das nu ma mit den Interfaces probiert, nur so wirklich funkt das nicht.

Testklasse:

Delphi-Quellcode:
unit uTestClass;

interface

uses
  SysUtils;

  type
    TTestClass = class(TObject, IInterface)
    protected
      FRefCount: integer;
    
      function _AddRef: Integer; stdcall;
      function _Release: Integer; stdcall;
      function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
    public
      class function NewInstance: TObject; override;
      property RefCount: Integer read FRefCount;
    end;

implementation

{ TTestClass }

function TTestClass._AddRef: Integer;
begin
  FRefCount := RefCount + 1;
  Result := FRefCount; // [X] HALTEPUNKT
end;

function TTestClass._Release: Integer;
begin
  FRefCount := FRefCount - 1;
  Result := FRefCount; // [X] HALTEPUNKT
  if Result = 0 then
    Destroy;
end;

function TTestClass.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
  if GetInterface(IID, Obj) then
    Result := 0
  else
    Result := E_NOINTERFACE;
end;

class function TTestClass.NewInstance: TObject;
begin
  Result := inherited NewInstance;
  TTestClass(Result).FRefCount := 1;
end;
Dazu wird an einer bestimmten Stelle folgender Code aufgerufen:

Delphi-Quellcode:
var
  t: TTestClass;
begin
  t := TTestClass.Create();
  t := nil;
end;
Tja, was soll ich sagen, weder _AddRef noch _Release werden aufgerufen. So funktioniert das schon mal auf alle Fälle nicht.

@Marphy:
Das Ding bei deinem Vorschlag ist ja, das erstma die Liste initialisiert werden muss. Dann muss ich ja auch noch alle Nase lang die temp. Variablen deklarieren um damit zu arbeiten. Wenn ich die nicht deklariere, dann komm ich ja nicht über das "MyList.Add()" hinaus. Danach muss ich dann auch noch mich zumindest um das Freigeben der Liste kümmern.
In etwa bin ich wieder bei +/- 0, ich muss weiterhin die Variablen deklarieren und ich muss weiterhin mich ums freigeben kümmern (auch wenn ein wenig einfacher nu). Ich finde, da lohnt sich das neuschreiben einer TVectorList Klasse noch nicht mal plus das umschreiben des bisherigen Codes für das Ergebnis.
Aber danke für den Denkanstoß!


MfG
- Thebe
  Mit Zitat antworten Zitat