Registriert: Do Mär 05, 2009 20:17 Beiträge: 284 Wohnort: Kaiserslautern
Hallo,
diese Frage stelle ich im Allgemeinen, weil sie eher Delphi bzw Klassen betrifft. Übrigens hab ich es mit den Klassen auch noch immer nicht wirklich so drauf.. also wenn ich was grundsätzlich falsch mache, einfach sagen..
So nun zum Problem:
Ich hab ne Klasse gebaut, die ihrerseits 2 objekte einer anderen Klasse erstellt.
So:
Code:
constructor TMyMeasure.Create;
begin
inherited Create;
FP1 := TMyPoint.Create; // objekt aus anderer Klasse
FP2 := TMyPoint.Create;
waitforfirst := true;
waitforsecond := false;
waitfornothing := false;
end;
soweit so nett, jetzt pappe ich die Instanzen von TMyMeasure in eine TObjectList mit .ownsobjects, weil ich gelesen habe das dann die TObjectlist bei der Freigabe sich um die Freigabe seiner Objecte kümmert. Tut sie auch, nur nicht für die Kinder der Objekte... also generiert ein MyObjectList.free ein Speicherleck von jeweils 2x TMyPoints. Ich hab dann versucht einen destructor für TMyMeasure zu schreiben, der aber scheinbar nie aufgerufen wird..
Code:
destructor TMyMeasure.Destroy;
begin
FP1.Free;
Fp2.Free;
FP1 := nil;
FP2 := nil;
end;
im Ergebnis hab ich jetzt die Speicherlecks nur wegbekommen indem ich bei ONClose meiner Anwendung durch die Liste renne und für alle Objekte FP1 und FP2 free setze.
Code:
for i := 0 to MyMeasureList.count-1 do
begin
TMyMeasure(MyMeasureList.items[i]).P1.free;
TMyMeasure(MyMeasureList.items[i]).P2.free;
end;
Jetzt die eigentlichen Fragen:
1.) Wieso wird mein destruktor nicht aufgerufen? 2.) Gibts da nichts einfacheres / besseres, mache ich eventuell grundsätzlich was verkehrt?
Danke schonmal
Zuletzt geändert von Wölfchen am So Mär 31, 2013 11:49, insgesamt 1-mal geändert.
(ich habe das letzte Nacht auch schon gesehen, konnte mir aber keinen Reim drauf machen)
Kaum schreibt man das override hintendran, wird der Destruktor wohl doch von MyObjectList.free aufgerufen.. und die Schleife bei On-Close wird unnötig, bzw. sogar schädlich!
Hab vielen Dank und noch ein schönes Osterfest!
Wolfgang
Zuletzt geändert von Wölfchen am So Mär 31, 2013 10:29, insgesamt 1-mal geändert.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Das inherited (inherited; reicht hier, der Name der Funktion muss nicht explizit dahinter) muss beim Destroy natürlich ans Ende. Und der Vorfahr ist TObject sofern man nichts spezifisch angibt. Bei einem Destroy ohne override müsstest du eigentlich eine Compilermeldung bekommen dass die virtuelle Methode vom Basisobjekt verborgen wird.
Ich mache das übrigens teilweise auch mit einer TObjectList so dass ich alle Objekte sammle und sie damit automatisch freigeben lasse. Klappt hier seit Jahren wunderbar
Registriert: Do Mär 05, 2009 20:17 Beiträge: 284 Wohnort: Kaiserslautern
Sascha Willems hat geschrieben:
Das inherited (inherited; reicht hier, der Name der Funktion muss nicht explizit dahinter) muss beim Destroy natürlich ans Ende.
gut, ich habs jetzt so:
Code:
destructor TMyMeasure.Destroy;
begin
FP1.Free;
Fp2.Free;
FP1 := nil;
FP2 := nil;
inherited Destroy;
end;
Sascha Willems hat geschrieben:
Ich mache das übrigens teilweise auch mit einer TObjectList so dass ich alle Objekte sammle und sie damit automatisch freigeben lasse. Klappt hier seit Jahren wunderbar
Ja bei meinen bisherigen Klassen *hust* (die drei ohne die es einfach nicht ging) hab ich das auch so gemacht, aber ich habe auch nie gewagt in einer Klasse Objekte anderer Klassen zu erzeugen... Das war für mich bisher komplizierte Hexerei und böses Juju Danke euch allen! Das Forum hier ist wirklich toll und hilfreich!
Registriert: Sa Jan 01, 2005 17:11 Beiträge: 2067
Programmiersprache: C++
Nein, in diesem Fall ist es so richtig formuliert. Es wird die Funktion von TObject überdeckt und nicht überschrieben. Der Unterschied ist, dass TObject(Bla).destroy; die Funktion von TObject aufruft und erst Bla.destroy seinen eigenen Destruktor. Der Grund weshalb das TMyMeasure.destroy nicht aufgerufen wird, ist das die Liste auf Basis von TObject arbeitet.
Mitglieder in diesem Forum: 0 Mitglieder und 10 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.