Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#4

Re: onCreate für eigene Klasse?

  Alt 31. Mär 2007, 13:24
HI,
was der Neutral General vergessen hat zu sagen ist, dass es auch immer einen Destruktor gibt. Deine Frage ist zwar schon beantwortet und Du wirst mit dem Konstruktor ohne Probleme arbeiten können (wichtig ist, dass Du die erste Zeile inherited Create immer übernimmst).

Ein Konstruktor sorgt dafür, dass Dein Objekt erzeugt wird. Das Gegenstück ist dann der Destruktor, der sorgt dafür, dass der dein Objekt wieder frei gegeben wird. So kann es sein, dass ein Bild das Du betrachtest > 100 MByte Speicher belegt. Du schaust es Dir an und schließt es (irgendwann). Jetzt wäre es sicher in Deinem Interesse das die > 100 MByte auch wieder frei gemacht werden. Ansonsten kannst Du Dir kurz überlegen ab wann Dein Speicher voll ist.

Genau für dieses Aufräumen ist dann der Destruktor zuständig. Wird kein Destruktor aufgerufen, wird der Speicher erst mit dem Ende des gesamten Programms frei gegeben (dort dann aber unter Garantie). Hast Du jetzt aber einen Bildbetrachter und schaust Dir 10 Bilder an, wäre es schlecht wenn 900 MByte einfach mal unnütz mit Müll belegt werden.

Lange Rede, kurzer Sinn, alles wofür Du im Konstruktor speicher allozierst (also Objekte die Du mit Create erzeugst, dyn. Arrays deren Länge Du setzt, Speicher den Du mittels GetMem oder New reservierst) solltest Du auch wieder im Destruktor frei geben.

Delphi-Quellcode:
TKlasse = class
private
  FObject: TXyz;
public
  constructor Create;
  destructor Destroy; override;
end;

constructor TKlasse.Create;
begin
  inherited Create;
  // Dein Code

  // neues Object erzeugt
  self.FObject := TXyz.Create;
end;

destructor TKlasse.Destroy;
begin
  // freigeben von erzeugten Objekten
  self.FObject.Free;

  inherited Destroy;
end;
Destruktoren haben immer diese Form und sollten immer mit override überschrieben werden (bei Konstruktoren ist das nicht nötig/möglich). Wichtig beim Destruktor ist auch, dass Du wirklich Destroy überschreibst. Willst Du ein Objekt frei geben, solltest Du zwar immer die Methode Free verwenden, diese ruft aber für Dich schon Destroy auf. Free stellt nur sicher, dass der Objekt-Verweis nicht nil ist, bevor dessen Destruktor aufgerufen wird.

Gruß Der Unwissende
  Mit Zitat antworten Zitat