Hallo,
leite ich Klassen von TInterfacedPersistent ab, meldet mir FastMM, dass diese Klasse ein Speicherleck verursacht.
Folgendes Beispiel:
Delphi-Quellcode:
unit ClassesSB;
interface
uses SysUtils, Classes;
type
ISBParam =
interface(IInterface)
['
{3A2C91E1-9935-436B-BCCE-489F0615F5D1}']
function GetValue(
const sParamFieldName :
string;
const iParamType : integer) :
string;
end;
TSBParamClass =
class of TSBParam;
TSBParam =
class(TInterfacedPersistent, ISBParam)
//TSBParam = class(TInterfacedObject, ISBParam)
private
public
function GetValue(
const sParamFieldName :
string;
const iParamType : integer) :
string;
virtual;
end;
TSBParamTest =
class(TSBParam)
private
public
function GetValue(
const sParamFieldName :
string;
const iParamType : integer) :
string;
override;
end;
implementation
{ TSBParam }
function TSBParam.GetValue(
const sParamFieldName:
string;
const iParamType: integer):
string;
begin
Result := '
';
end;
{ TSBParamTest }
function TSBParamTest.GetValue(
const sParamFieldName:
string;
const iParamType: integer):
string;
begin
Result := Format('
Param=%s Type=%d', [sParamFieldName, iParamType]);
end;
initialization
RegisterClasses([TSBParamTest]);
end.
Und so wird es verwendet:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var sbParam : ISBParam;
begin
sbParam := TSBParamClass(FindClass('TSBParamTest')).Create;
//sbParam := TSBParamTest.Create;
ShowMessage(sbParam.GetValue('FieldName', 1));
end;
Nutze ich TInterfacedObject als Basisklasse (Kommentare), ist FastMM zufrieden. Allerdings hatte ich vor, die Klassen aus dem Namen als Text zu erzeugen (die Klassennamen sind extern gespeichert), und FindClass arbeitet nur mit Derivaten von TPersistentClass.
Sicher wäre es ein Wordaround, das FindClass mit einer eigenen Listenklasse nachzubilden - aber den Aufwand würde ich mir gern sparen. Ausserdem interessiert es mich, ob wirklich ein Speicherleck entsteht oder FastMM hier eine Falschmeldung produziert.