Du musst Dir angewöhnen, jedes instantiierte Objekt im korrespondierenden Kontext wieder freizugeben:
Hier ein paar Beispiele;
Delphi-Quellcode:
Procedure LokaleInstantiierung;
Var
MyObject : TMyObject;
Begin
MyObject := TMyObject.Create;
Try
// ... tu was mit MyObject
Finally
MyObject.Free;
End;
End;
Delphi-Quellcode:
Unit GlobaleInstantiierung;
Interface...
implementation
Var
MyObject : TMyObject;
...
Initialization
MyObject := TMyObject.Create;
Finalization
MyObject.Free;
End;
Delphi-Quellcode:
Type
TClassField = Class (TBigObject)
FMyObject : TMyObject;
Public
Constructor Create;
Destructor Destroy;
End;
...
Constructor TClassField .Create;
Begin
...
FMyObject := TMyObject.Create;
End;
Destructor TClassField.Destroy;
Begin
FMyObject.Free;
Inherited
End;
Delphi-Quellcode:
Type
TFormInstantiierung = Class (TForm)
...
Procedure FormCreate (Sender : TObject);
Procedure FormDestroy (Sender : TObject);
...
Private
FMyObject : TMyObject;
End;
Procedure TFormInstantiierung.FormCreate (Sender : TObject);
Begin
...
FMyObject := TMyObject.Create;
End;
Procedure TFormInstantiierung.FormDestroy (Sender : TObject);
Begin
...
FMyObject.Free;
End;
Und vielleicht noch 'FreeAndNil' statt '.Free', das vermeidet böse Fehler.
Dann noch:
Einen Thread einfach so zu killen (mit Free / Destroy) ist natürlich tödlich. Richtig macht man es so:
Delphi-Quellcode:
With MyThread Do Begin
Terminate; // Hör auf!
WaitFor; // Warte bis er aufgehört hat!
Free; // Jetzt erst resourcen freigeben (u.a. das Threadhandle ;-)
End;