AGB  ·  Datenschutz  ·  Impressum  







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

Objekte (Klassen) freigeben notwendig?

Ein Thema von Alfonso · begonnen am 22. Jun 2006 · letzter Beitrag vom 22. Jun 2006
Antwort Antwort
Alfonso

Registriert seit: 10. Jan 2006
250 Beiträge
 
Delphi 11 Alexandria
 
#1

Objekte (Klassen) freigeben notwendig?

  Alt 22. Jun 2006, 15:58
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;
Alfonso
Seit Turbo Pascal 3.0 dabei!
Ewiger Pascal Fan!
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.893 Beiträge
 
Delphi 12 Athens
 
#2

Re: Objekte (Klassen) freigeben notwendig?

  Alt 22. Jun 2006, 16:01
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
Thomas Breitkreuz
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#3

Re: Objekte (Klassen) freigeben notwendig?

  Alt 22. Jun 2006, 17:03
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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Objekte (Klassen) freigeben notwendig?

  Alt 22. Jun 2006, 17:15
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Thorben77

Registriert seit: 22. Okt 2004
359 Beiträge
 
#5

Re: Objekte (Klassen) freigeben notwendig?

  Alt 22. Jun 2006, 17:19
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 , 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 .
  Mit Zitat antworten Zitat
Alfonso

Registriert seit: 10. Jan 2006
250 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Objekte (Klassen) freigeben notwendig?

  Alt 22. Jun 2006, 17:23
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
Alfonso
Seit Turbo Pascal 3.0 dabei!
Ewiger Pascal Fan!
  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 08:12 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