AGB  ·  Datenschutz  ·  Impressum  







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

Free gibt die Klasse nicht frei

Ein Thema von Bigeddie · begonnen am 21. Feb 2007 · letzter Beitrag vom 21. Feb 2007
Antwort Antwort
Bigeddie

Registriert seit: 5. Mär 2005
Ort: Kerzenheim
98 Beiträge
 
#1

Free gibt die Klasse nicht frei

  Alt 21. Feb 2007, 09:41
Hallo Leute,

habe eine Klasse (abgeleitet von TComponent). Nun folgendes Problem.

Ein Objekt dieser Klasse wird zu einer bestimmten Zeit in der Unit erzeugt und soll zu einer bestimmten Zeit auch wieder freigegeben werden.
Nach dem Aufruf der Methode free sollte die Variable vom Typ Klasse eigentlich NIL sein ist sie aber nicht. Wo liegt hier das Problem?

Grüße Ernst Jürgen
kommt zeit
kommt rat
kommt attentat
oder wie war das?
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Free gibt die Klasse nicht frei

  Alt 21. Feb 2007, 09:44
... daran, dass Free den Destructor aufruft und das Objekt freigibt, aber sich nicht darum kümmert die Variable irgendwie zu verändern. Warum auch. Du kannst doch mit 'zig Variablen auf ein und dieselbe Instanz zeigen - soll er dir alle auf einmal auf Nil setzen? Dazu müsste er alle Variablen kennen die auf das Objekt zeigen - und das tut er nicht. Er kennt nicht mal eine Variable.

Abhilfe schafft es hier, die Variable nach dem Free selbst auf Nil zu setzen oder die Procedure FreeAndNil() zu verwenden, die einen Free Aufruf und das Nil setzen vereint in einer Prozedur.
  Mit Zitat antworten Zitat
Bigeddie

Registriert seit: 5. Mär 2005
Ort: Kerzenheim
98 Beiträge
 
#3

Re: Free gibt die Klasse nicht frei

  Alt 21. Feb 2007, 10:06
FreeAndNil zeigt mir aber bei d6 mein Objekt nicht in der Programmierhilfe an.

Kann es dadurch nicht zu speicherlöchern kommen?

Außerdem dachte ich, beim Aufruf Objekt.free würde die Variable automatisch auf NIL gesetzt.

Ich versuchs jedenfalls mal aus und melde mich dann nochmal

Danke und Grüße

Ernst Jürgen
kommt zeit
kommt rat
kommt attentat
oder wie war das?
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Free gibt die Klasse nicht frei

  Alt 21. Feb 2007, 10:14
Moin Ernst,

Zitat von Bigeddie:
FreeAndNil zeigt mir aber bei d6 mein Objekt nicht in der Programmierhilfe an.
das ist auch keine Methode, sondern eine Funktion. Gib mal FreeAndNil in der Hilfe ein, oder schreib' es in die IDE und drücke F1.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Konse

Registriert seit: 20. Feb 2007
Ort: Bayern
27 Beiträge
 
Delphi 7 Professional
 
#5

Re: Free gibt die Klasse nicht frei

  Alt 21. Feb 2007, 11:00
Hoi Ernst,
meines wissens musst du die Free Methode dann auch in deiner Klasse deklarieren.
Ansonsten wird bei dem Benutzen von DeineKlasse.Free oder FreeAndNil(deineKlasse), der destruktor vom Vorfahren aufgerufen.
Im Destruktor kannst du dann Vorkehrungen treffen das element auf nil zu setzen.
Falls ich da falsch liege berichtigt mich !
Man lernt ja gerne dazu ^^


Gruß Konse
Warum ich Klingonische Programmierer so liebe:
- A true Klingon programmer does not comment his code
- You cannot truly appreciate Dilbert unless you´ve read in the original klingon
  Mit Zitat antworten Zitat
TBx
(Administrator)

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

Re: Free gibt die Klasse nicht frei

  Alt 21. Feb 2007, 11:07
@Konse: Ja, da muß ich dich berichtigen.
Destructoren sind normalerweise - eben damit da Free in Nachfahren greift - virtuell deklariert.
Daher überschreibt man einen Destructor auch in der Regel mit der Direktive override.

Hat man sich daran gehalten, muß das Free nicht erneut definiet werden.

Gruß

Thomas
Thomas Breitkreuz
Gruß Thomas
- Admin DelphiPRAXIS
- Admin Delphi-Treff
- Embarcadero MVP
  Mit Zitat antworten Zitat
Konse

Registriert seit: 20. Feb 2007
Ort: Bayern
27 Beiträge
 
Delphi 7 Professional
 
#7

Re: Free gibt die Klasse nicht frei

  Alt 21. Feb 2007, 11:38
@onlineKater: Ich gebe dir diesbezüglich recht "Wenn" der Destruktor des Vorfahrens virtuell deklariert worden ist.

Bei Abstrakten klassen, die auch datencontainer enthalten können, setzt du dort deinen Destruktor virtuell??
"wenn ja, wäre ein beispiel nicht schlecht, wie du dir deine resourcen freest"

ich überschreibe da den destruktor von Tobject mit override
-> mein nachfahre hat sich darum zu kümmern im destructor inherited aufzurufen.

wenn jedoch die free methode von TObject (superclass) aufgerufen wird, so wird maximal nur die abstrakte klasse
freigegeben wenn man die free methode nicht im nachfahren nochmals redeklariert.

Tobj -> TMyAbstrClass -> TMyNachfahre




Beste Grüße,
Mario
Warum ich Klingonische Programmierer so liebe:
- A true Klingon programmer does not comment his code
- You cannot truly appreciate Dilbert unless you´ve read in the original klingon
  Mit Zitat antworten Zitat
IngoD7

Registriert seit: 17. Feb 2004
464 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Free gibt die Klasse nicht frei

  Alt 21. Feb 2007, 11:45
Zitat von Konse:
Bei Abstrakten klassen, die auch datencontainer enthalten können, setzt du dort deinen Destruktor virtuell??
[...]
ich überschreibe da den destruktor von Tobject mit override
-> mein nachfahre hat sich darum zu kümmern im destructor inherited aufzurufen.
Das gilt doch für alle Nachfahren, also für TMyAbstrClass und für TMyNachfahre.
Übrigens: Ein Destructor mit override ist selbst auch wieder virtuell.

Zitat von Konse:
wenn jedoch die free methode von TObject (superclass) aufgerufen wird, so wird maximal nur die abstrakte klasse
freigegeben wenn man die free methode nicht im nachfahren nochmals redeklariert.
Nein, wenn MyInstanz von TMyNachfahre (MyInstanz:=TMyNachfahre.Create) ist, dann ruft ein MyInstanz.Free den Destructor von TMyNachfahre auf.
  Mit Zitat antworten Zitat
Konse

Registriert seit: 20. Feb 2007
Ort: Bayern
27 Beiträge
 
Delphi 7 Professional
 
#9

Re: Free gibt die Klasse nicht frei

  Alt 21. Feb 2007, 12:03
Zitat:
Übrigens: Ein Destructor mit ovveride ist selbst auch wieder virtuell.
das war wohl das schlüsselwort. Danke für deine Korrektur.
Du hast recht.


Gruß, Mario
Warum ich Klingonische Programmierer so liebe:
- A true Klingon programmer does not comment his code
- You cannot truly appreciate Dilbert unless you´ve read in the original klingon
  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 14:51 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