@himitsu
Stimmt ... das
const
ist der Üpeltäter
Delphi-Quellcode:
program dp_184063;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
type
IFoo =
interface
['
{FEF0782C-9F48-4060-A79D-8697F8431718}']
procedure Bar;
end;
TFoo =
class( TInterfacedObject, IFoo )
private
FName:
string;
public
constructor Create(
const Name:
string );
destructor Destroy;
override;
procedure Bar;
end;
{ TFoo }
constructor TFoo.Create(
const Name:
string );
begin
inherited Create;
FName :=
Name;
WriteLn( '
TFoo(', FName, '
).Create' );
end;
destructor TFoo.Destroy;
begin
WriteLn( '
TFoo(', FName, '
).Destroy' );
inherited;
end;
procedure TFoo.Bar;
begin
WriteLn( '
TFoo(', FName, '
).Bar' );
end;
procedure CallConstFoo(
const aFoo: IFoo );
begin
aFoo.Bar;
end;
procedure CallFoo( aFoo: IFoo );
begin
aFoo.Bar;
end;
procedure Test;
begin
CallConstFoo( TFoo.Create( '
ConstFoo' ) );
CallFoo( TFoo.Create( '
Foo' ) );
end;
begin
ReportMemoryLeaksOnShutdown := True;
try
Test;
except
on E:
Exception do
WriteLn( E.ClassName, '
: ', E.
Message );
end;
ReadLn;
end.
ergibt bis zum abschließenden
ReadLn
Code:
TFoo(ConstFoo).Create
TFoo(ConstFoo).Bar
TFoo(Foo).Create
TFoo(Foo).Bar
TFoo(Foo).Destroy
und somit einen MemLeak für die
ConstFoo benannte Instanz
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9
dc 90 9d f0 e9 de 13 da 60)