Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Objekte (Klassen) freigeben notwendig? (https://www.delphipraxis.net/71919-objekte-klassen-freigeben-notwendig.html)

Alfonso 22. Jun 2006 14:58


Objekte (Klassen) freigeben notwendig?
 
Hallo,

muss ich eine Klasse freigeben, bevor die Procedure verlasen wird, wo Sie erzeugt wurde? Oder räumt Delphi automatisch auf?

Beispiel:

Delphi-Quellcode:
Procedure Tmainform.test
var
  Kasse: TclsKasse;

Begin
  Kasse:=tclsKasse.Create;
  Kasse.DoSomething;

  Kasse.Free; //  <--- Ist das Notwendig?
end;

TBx 22. Jun 2006 15:01

Re: Objekte (Klassen) freigeben notwendig?
 
Hallo Alfonso!

Ja, es ist nötig.

Du solltest dazu mit einem try-finally-Block arbeiten:

Delphi-Quellcode:

Begin
  Kasse:=tclsKasse.Create;
  try
    Kasse.DoSomething;
  finally
    Kasse.Free; //  Das ist Notwendig
  end;
end;
Das bewirkt, daß Dein Objekt auch dann wieder freigegeben wird, wenn in der Verarbeitung irgendetwas schief geht.

Gruß

onlinekater

Phoenix 22. Jun 2006 16:03

Re: Objekte (Klassen) freigeben notwendig?
 
Zitat:

Zitat von Alfonso
Hallo,

muss ich eine Klasse freigeben

Nein, kannst Du gar nicht :-p

Sorry, bin grad etwas im Klugscheissmodus, aber Klassen kann man gar nicht freigeben, weil sie ja 'nur' der Bauplan für konkrete Instanzen, also die Objekte sind.

Um die Frage richtig zu interpretieren:
Ja, Du musst ein Objekt welches Du in einer Methode instanziert hast auch wieder freigeben.

Lokale Variablen wie strings, Ganz- oder Fließkommazahlen werden von Delphi selber erzeugt und wieder freigegeben, aber Variablen die Objekte beherbergen sind für Delphi nur Zeiger. Der Speicherplatz für den Zeiger wird zwar erzeugt und auch automatisch freigeräumt, nicht jedoch der Speicher, auf den dieser Zeiger zeigt.

Will heissen wenn Du ein Objekt erzeugst und einer lokalen Variablen zuweist, so reservierst Du den Speicher und nach dem beenden wird der Zeiger auf diesen Speicher weggeworfen, Du hast also Speicher angefordert, bekommst aber hinterher nie mehr heraus, wo denn dieser Speicher liegt um ihn zurückzugeben. Das nennt sich Speicherleck und sollte idealerweise vermieden werden.

SirThornberry 22. Jun 2006 16:15

Re: Objekte (Klassen) freigeben notwendig?
 
prinzipiell gilt in Delphi. Speicher den du selbst Anforderst musst du auch selbst frei geben.
TObjec.Create fordert auch speicher an, und somit solltest du den Speicher auch freigeben.

Es gibt eine Ausnahme wo man speicher nicht freigeben muss (aber kann):
Alle Klassen die von TComponent abgleitet sind bzw. TComponent selbst haben beim Constructor den Parameter Owner. Ezreugst du eine Komponente (TComponent + Nachfahren) und übergibst dort einen Owner so wird deine Komponente frei gegeben wenn der Owner frei gegeben wird. Es schade allerdings auch nicth wenn du die Komponente selbst frei gibst bevor du den Owner frei gibst.
Man sollte sich generell angewöhnen Speicher den man angefordert hat auch wieder frei zu geben.

Thorben77 22. Jun 2006 16:19

Re: Objekte (Klassen) freigeben notwendig?
 
Zitat:

Zitat von Phoenix
Sorry, bin grad etwas im Klugscheissmodus, aber Klassen kann man gar nicht freigeben, weil sie ja 'nur' der Bauplan für konkrete Instanzen, also die Objekte sind.

Wenn Du schon dabei bist :wink: , musst Du aber auch von Klasseninstanzen reden, denn ich glaube nicht, dass Alfonso so was verwendet:
Delphi-Quellcode:
type
  TMyObject = object
  end;
Warum heißt es dann nicht Klassenorientierte Programmierung :mrgreen: .

Alfonso 22. Jun 2006 16:23

Re: Objekte (Klassen) freigeben notwendig?
 
Vielen Dank für eure Antworten.
Ich hatte es mir ja schon gedacht, aber ganz sicher war ich mir nicht.

Ich habe halt bisher Objekte in Form von Komponenten kennengelernt, und dort werden Sie vom Formular freigegeben. Eigene Objekte hatte ich bisher nicht.

Gruß und Danke

Alfonso


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz