folgender kleiner Test läuft bei Delphi problemlos durch, bei Freepascal gibt es einen SIGSEGV. Wenn man vorher die Interface-Variable auf nil setzt, funktioniert dies auch bei Freepascal. Welches Verhalten ist das richtigere? Ich sehe Argumente für beide Features:
Code: Alles auswählen
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
SysUtils, Classes;
type
ITestInterface = interface
['{DC209DB2-6E2D-4680-93D6-5D9B3983C0D3}']
function OnlyDummy: integer;
end;
TFoo = class
public
Intf: ITestInterface;
end;
{ TBar }
TBar = class(TComponent, ITestInterface)
public
function OnlyDummy: integer;
end;
{ TBar }
function TBar.OnlyDummy: integer;
begin
Result := -1;
end;
var
Foo: TFoo;
Bar: TBar;
begin
// ReportMemoryLeaksOnShutdown := true;
Foo := TFoo.Create;
Bar := TBar.Create(nil);
Foo.Intf := Bar;
// Foo.Intf := nil;
Bar.Free;
Foo.Free;
end.
PS.: Kann mir jemand erklären, warum man die interfaced Klasse extra aufräumen muss? Dies ist bei Delphi und Freepascal gleich. Leite ich nicht von TComponent (welches andere Interfaces implementiert) ab, funktioniert die Referenzzählung und man braucht "Bar" nicht selber frei zu geben.