AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

onCreate für eigene Klasse?

Ein Thema von .chicken · begonnen am 31. Mär 2007 · letzter Beitrag vom 31. Mär 2007
Antwort Antwort
Der_Unwissende

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

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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz