
Objekte korrekt freigeben
-
- 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
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
Ich stecke gerade im Buch beim Thema Events...

Ich mag Pascal...
-
- Beiträge: 2118
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Objekte korrekt freigeben
Ich habe dir mal ein schnelles Beispiel geschrieben:
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
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.
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.
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}
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.
-
- 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