Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Jul 09, 2025 20:04

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: TObjectList <-> Speicherfreigabe
BeitragVerfasst: Mi Jul 12, 2006 12:25 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Jo im OffTopic bei nem anderen Thread habe ich gelesen, dass TObjectList automatisch seine Objekte freigibt.
Sora das wollt ich jetzt auch.
So weit so gut, irgendwas gibt der schon frei, nur kommt der nie in den Destuktor meines Objektes.

Was muss ich beachten, damit das funktioniert? In der Delphi-Doku steht leider nicht allzu viel dazu.


MfG Pellaeon

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 12, 2006 12:31 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
hast du den destructor mit
Code:
  1. destructor destroy;override;

deklariert?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 12, 2006 13:52 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Instantiierst Du die TObjectList mit AOwnsObjects=true? wenn nein, gibt er sie nicht frei. Wenn ja, dann gibts immernoch Möglichkeiten, objekte aus der Liste zu entfernen, ohne sie freizugeben (Thema Extract).

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 12, 2006 16:15 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Nein ich habe einen destructor free;

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 12, 2006 16:52 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Der Destructor ist aber Destroy, free überprüft nur ob das Objekt existiert und ruft dann Destroy auf.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 12, 2006 18:57 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
in TObject ist der Destruktor folgendermaßen deklariert:
Code:
  1. destructor destroy;virtual;

Diesen Destruktor überschreibt man mit
Code:
  1. destructor destroy;override;

dabei ruft man üblicherweise den Vorgänger mit
Code:
  1. inherited;

das ist aber bei direkt von TObject abgeleiteten Objekten nicht unbedingt nötig, da der destructor von TObject leer ist.

die Prozedur free die auch in TObject deklariert ist prüft afaik einfach ob das objekt<>nil ist und ruft dann destroy auf. Da free nicht virtuell ist, kann es auch nicht überschrieben werden.

Eigene Destruktoren werden meines Wissens so gut wie nie verwendet (habs noch nicht gesehen), sondern es wird immer destroy überschrieben


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 12, 2006 20:27 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Das gilt jetzt aber nicht generell, sondern für TObject oder?
Weil ich generell in meinen Klassen(jetzt unabhängig von TObject usw.) den Destruktor free nenne. Habe ich so aus nem Delphi-Buch, als ich mir OOP in Delphi angeschaut habe.


MfG Pellaeon

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 12, 2006 21:12 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Es sind ja alle Objekte in delphi die mit class deklariert wurden von TObject abgeleitetet. Daher gilt das von mir erläuterte für alle Objekte. Auch Borland verwendet in ihren sourcen überall destroy als Destruktor.
Also verwende lieber den Standardstil.
Freigeben tut man Objekte trotzdem über obj.free bzw FreeAndNil(Obj), was ja dann den destruktor destroy aufruft


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 13, 2006 07:29 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Bei Objekten kannst du auch mehrere Konstruktorn bzw Destuktoren erstellen und benutzen. Das Problem an der Stelle ist aber, dass die fast alles (also auch die Objektlist) auf den Standarddestruktor aufsetzen. Und wenn du einen eigenen Destruktor hättest (was er in diesem Falle ja ist) kommen all diese Objekte damit nicht klar, da sie den Destruktor von TObjekt aufrufen würden. Und genau aus diesem Grund heißt der Destruktor Destroy und ist Virtuell. Damit man ihn von überall aus aufrufen kann.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 13, 2006 08:13 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Das mit dem Free klappt solange, wie Du eine Variable vom Typ Deiner Klasse hast. Dann ruft er tatsächlich die Methode Free deiner Klasse.
Wenn Du aber jetzt eine Variable vom Typ TObject hast, die auf eine Instanz Deiner Klasse zeigt, wird die Free-Methode von TObject gerufen, da diese nicht virtuell ist und der Compiler nicht nachschaut, ob sie vielleicht überschrieben ist. Und Free von TObject ruft eben Destroy auf.
Darum werden die 'Free' Destructoren der Objekte in Deiner TObject List nicht gerfen (Zeiger auf TObject).

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 13, 2006 11:05 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mai 29, 2006 21:13
Beiträge: 142
Wohnort: Ballenstedt/Sachsen-Anhalt
Pellaeon hat geschrieben:
Habe ich so aus nem Delphi-Buch, als ich mir OOP in Delphi angeschaut habe.


Frage: von wem ist das Buch? Ich wüsste gerne, wer sowas schreibt, da es meist zu Problemen führt (siehe Antworten vor mir).
Die destructoren sollten immer und überall gleich heißen. Es sei denn, du deklarierst deine Klasse als
Code:
  1. TMyClass=object
  2. ...
  3. end;

Das ist allerdings noch über TObject in der Hierachie, damit funktioniert keine Funktion die TObject-Methoden aufrufen will.

_________________
Gott sei Dank bin ich Atheist!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 13, 2006 11:50 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Bitte diese beiden Dinge nicht durcheinander hauen. Objekte sind keine Klassen! Das ist ein klassenähnliches Konstrukt was heutzutage nicht mehr verwendet werden sollte. Die beiden Dinge habe nur vom Prinzip her etwas gemeinsam. Aber Codetechnisch sind sie vollkommen getrennt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 13, 2006 11:58 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mai 29, 2006 21:13
Beiträge: 142
Wohnort: Ballenstedt/Sachsen-Anhalt
Eben. Aber ich hätte wetten können, irgendwo mal die Deklaration TObject = object gelesen zu haben... Hab geguckt, sieht nicht danach aus.

Was spricht eigentlich dagegen? Wenn ich nur mal schnell einen Record mit Methoden brauche, macht sich sowas besser/schneller als eine Klasse . Vor allem brauch ich kein Create/Free. Ok, ich geb ja zu, man braucht sowas ganz selten, alle viertel Jahre vielleicht.

Gruß,
Martok

_________________
Gott sei Dank bin ich Atheist!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 13, 2006 12:52 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
TObject = Object wäre mir allerdings sehr neu. Und dann würde ich ein bisschen meine Hochachtung vor dem TObject verliehren. ;-)

Na ja. Die Delphihilfe selber sagt, dass man es nach Möglichkeit nicht mehr verwenden sollte. Aber im Endeffekt bleibt alles dem Entwickler überlassen. Und da definiert es sein Geschmack ob er etwas machen möchte oder nicht.

Mir persönlich wiederstrebt ein bisschen die Vorstellung ein Record mir Methoden auszustatten. Ich habe es bisher immer geschafft entweder alles Sinnvoll in Klassen zu verpacken oder Funktionalität aus der Datenhaltung (Record) raus zu lassen. Vor allem, da es entweder zu komplex für ein Object wird oder eben sich nur um reine Datenhaltung handelt. Ist aber wie gesagt Geschmackssache. Und meinen Geschmack trifft es nicht. ;-)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 13, 2006 13:36 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Auch wenn man die in System deklarierten Sachen nicht ganz wörtlich nehmen kann:
Code:
  1.   TObject = class
  2.     constructor Create;
  3.     procedure Free;
  4.     ...
  5.     destructor Destroy; virtual;
  6.   end;
  7.  

Die über OBJECT deklarierten Objekte sind mehr oder weniger erweiterte Records (belegen statischen Speicher). Bei ihnen machen Konstruktoren/Destruktoren auch keinen wirklichen Sinn. TObject (intern ein Zeiger auf dynamischen Speicher) hat in Delphi nichts mit der über OBJECT deklarierten Objekten zu tun (bei Turbo Vision unter Turbo Pascal war das noch anders).


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.019s | 17 Queries | GZIP : On ]