Danke für den Hinweis. Da hätte ich auch selber drauf kommen können. Habs auch gleich ausprobiert. Es hilft aber nicht in dem folgenden Fall.
Ich habe eine von TWorldBox und damit von TComponent abgeleitete Klasse.
Delphi-Quellcode:
TMyBox = class(TWorldBox)
public
{ Public-Deklarationen }
Parameter : TParmeter;
destructor Destroy; override;
end;
destructor TMyBox.Destroy;
begin
FreeAndNil(Parameter);
inherited Destroy;
end;
Ein oder mehrere Komponenten vom Typ TMyBox erzeuge ich im Programm dynamisch aus einem übergeordneten Objekt TArea heraus. Dieses Objekt weist MyBox auch verschienen Parametersätze zu (ParameterA, ParameterB, ParameterC). Da ich nicht weiss, welcher Parametersatz am Ende in MyBox verlinkt ist, gebe ich im Destructor von TArea alle drei frei.
Delphi-Quellcode:
TArea = class(TObject)
MyBox : TMyBox;
ParameterA,
ParameterB,
ParamterC: TParameter;
constructor Create;
destructor Destroy; override;
end;
constructor TArea.Create;
begin
MyBox := TMyBox.Create(MainForm);
ParameterA := MyBox.Parameter;
ParameterB := TParameter.Create;
ParameterC := TParameter.Create;
end;
destructor TCalcArea.Destroy;
begin
FreeAndNil(ParmeterA);
FreeAndNil(ParmeterB);
FreeAndNil(ParmeterC);
FreeAndNil(MyBox);
inherited Destroy;
end;
Beim Programmende gibt es aber Probleme. Die Komponente MyBox wird von Delphi schon freigegeben bevor der Destructor von TCalcArea aufgerufen wird. Und Delphi scheint nicht über FreeAndNil freizugeben (Warum eigentlich nicht). Zusätzlich gibt es Probleme beim Freigeben des Parametersatzes der schon über MyBox freigegeben wurde.
Was kann man daran ändern?