Hallo zusammen,
Im Rahmen eines Beispielprojekts habe ich das in Spring4D implementierte TSingleton demonstriert.
Ich hatte hierzu auch eine Klasse, wo ich testweise einen "class
constructor" (also nicht den normalen Instanz-constructor) implementiert hatte,
da ich hier der Form wegen einen eigenen Demo-Referenzcounter initialisieren wollte.
Im Projekt habe ich FastMM4 aktiviert.
Aufgefallen ist mir, daß Klassen, welche einen (zusätzlichen) "class
constructor" haben, einen Memory Leak verursachen.
Die Frage für mich ist momentan, ob das nun in irgendeiner Weise ein Bug ist oder ich hier evtl. das Offensichtliche einfach nur übersehe und ich in einer Klasse, von welcher ich normale Instanzen erzeugen möchte, evtl. gar keinen "class
constructor" machen darf, weil ich hierdurch den Typ oder das Verhalten der Klasse ändere. Oder übersehe ich ganz was anderes?
Der reduzierte Beispielcode (Den Teil mit dem FInstanceCount kann man auch komplett rausnehmen, es reicht, daß der "class
constructor" vorhanden ist):
Code:
unit Tests;
interface
type
TMyClass1 = class(TObject);
TMyClass2 = class(TObject)
strict private class var
FInstanceCount: Integer;
public
class
constructor Create();
end;
TTest = record
public
class procedure Test(); static;
end;
implementation
uses
Spring.DesignPatterns;
{ TTest }
class procedure TTest.Test();
begin
// Passt:
Spring.DesignPatterns.TSingleton.GetInstance<TMyClass1>;
// Memory-Leak:
Spring.DesignPatterns.TSingleton.GetInstance<TMyClass2>;
end;
{ TMyClass2 }
class
constructor TMyClass2.Create();
begin
inherited;
FInstanceCount := 0;
end;
end.