Objekte korrekt freigeben

Für Fragen von Einsteigern und Programmieranfängern...
Marsmännchen
Beiträge: 294
Registriert: So 4. Mai 2014, 21:32
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10
CPU-Target: 64bit
Wohnort: Oranienburg

Re: Objekte korrekt freigeben

Beitrag von Marsmännchen »

Okay, aber damit bindet man sich ausschließlich an Windows, oder? Ich habe allerdings in der FP-Doku dazu nur ein paar dürre Worte gefunden. Wird eh noch zu hoch für mich sein :oops: Ich stecke gerade im Buch beim Thema Events...
Ich mag Pascal...

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Objekte korrekt freigeben

Beitrag von Warf »

Ich habe dir mal ein schnelles Beispiel geschrieben:

Code: Alles auswählen

program Test;
 
{$Mode ObjFpc}{$H+}
 
uses heaptrc; // als Indikator ob der Speicher wirklich freigegeben wurde eignet sich heaptrc hervorragend
 
type
  IMyClass = interface //Selbe Public Signatur wie klasse
    procedure Foo;
    function Bar: Integer;
  end;
 
  { TMyClass }
 
  TMyClass = class(TInterfacedObject, IMyClass)  // TInterfacedObject für den Referenzzähler
  public
    procedure Foo;
    function Bar: Integer;
  end;
 
{ TMyClass }
 
procedure TMyClass.Foo;
begin
  WriteLn('Foo');
end;
 
function TMyClass.Bar: Integer;
begin
  Result := 4;
end;
 
var o1, o2, o3: IMyClass;
begin
  // 2 Objekte erzeugen
  o1:=TMyClass.Create;
  o2:=TMyClass.Create;
  // Objekt 1 neue Referenz (o3) geben
  o3:=o1;
  // Irgend etwas mit o1-o3 machen
  WriteLn(o1.Bar);
  o2.Foo;
  o3.Foo;
  // Variablen auf nil setzen => Objekte werden Freigegeben
  o1:=nil;
  o3:=nil;
  o2:=nil;
end.


Der Referenz Counter wird von TInterfacedObject implementiert. Falls es dir nicht möglich sein sollte von TInterfaced Object abzuleiten, kannst du einfach den Code von TInterfacedObject in deine Klasse kopieren (Strg auf TInterfacedObject Klick und du hast die Definition).

Das Funktioniert auf allen Betriebsystemen, da der FPC dank DelphiKompatiblität Interfaces immer als COM interfaces handhabt. wenn man das nicht möchte muss man explizit das mit

Code: Alles auswählen

{$Interfaces CORBA}

Umstellen (was ich meist mache, da ich sonst diesen dämlichen Referenzzähler immer implementieren muss, selbst wenn ich ihn nicht brauche)

Das ist mMn auch etwas bescheuert (damals von Borland) designed, das man zwar Referenzzählung hat, aber nur von Interfaces, das könnte problemlos auf alle Klassen ausgeweitet werden.

Marsmännchen
Beiträge: 294
Registriert: So 4. Mai 2014, 21:32
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10
CPU-Target: 64bit
Wohnort: Oranienburg

Re: Objekte korrekt freigeben

Beitrag von Marsmännchen »

Cool :D
Danke!
Ich mag Pascal...

Antworten