![]() |
Abgeleitet von TObject -> Destroy -> Inherited -> U
Hi,
irgendwie reichen mir im Titel die 45 Buchstaben nich :roll: ;) Ich hab eine Klasse (TLiveUpdate) von TObject abgeleitet:
Delphi-Quellcode:
Per FreeAndNil(LiveUpdate) zerstöre ich das Object, aber bei "inherited" bekomme ich eine ungültige Zeigeroperation. Ich hab das ganze schon durchgesteppt, konnte aber keinen anderen fehler finden. Vllt. wisst ihr ja was.
TLiveUpdate = class(TObject)
private FFiles: array of TUpdate; ... public Updates: array of TUpdate; destructor Destroy; override; ... end; destructor TLiveUpdate.Destroy; var I: Integer; begin for I := 0 to Length(FFiles) - 1 do begin FFiles[I].Free; end; for I := 0 to Length(Updates) - 1 do begin Updates[I].Free; end; // Bis hier hin läuft alles perfekt inherited; end; Wahrscheinlich steh ich ma wieder auffem Schlach Danke. |
Re: Abgeleitet von TObject -> Destroy -> Inherited -&a
Versuche mal statt
Delphi-Quellcode:
das:
Updates[I].Free;
Delphi-Quellcode:
;)
FreeAndNil (Updates[I]);
|
Re: Abgeleitet von TObject -> Destroy -> Inherited -&a
An dem liegt es nicht (wie schon gesagt).
Ich habs trotzdem ma ausprobiert, aber es geht trotzdem nicht |
Re: Abgeleitet von TObject -> Destroy -> Inherited -&a
Bevor ich jetzt mehr tippe...
Hast du irgendeine Ausrede warum du ein array of ... anststatt einer ObjectList o.ä. benutzt? Könnte ja sein (ist ziemlich unwahrscheinlich, aber passieren kann alles...) Edit: -es |
Re: Abgeleitet von TObject -> Destroy -> Inherited -&a
Ich meine jetzt nicht das Objekt, dessen destructor aufgerufen wird, sondern die Objekte im Array,
bei mir kam sowas auch schonmal, und soweit ich mich erinnere, konnte ich es so lösen ... (Oder nimm, wie _G es empfiehlt, eine TObjectList) |
Re: Abgeleitet von TObject -> Destroy -> Inherited -&a
Öhm,
Ausrede? :oops: Ne eigentlich nicht. Normalweise benutze ich ja die ObjectList, aber keine Ahnung warum jetzt nicht. *Umbau* |
Re: Abgeleitet von TObject -> Destroy -> Inherited -&a
So,
ich habs umgebaut. Jetzt bekomme ich das:
Code:
---------------------------
Liveupdate --------------------------- Zugriffsverletzung bei Adresse 00000000. Lesen von Adresse 00000000. --------------------------- OK ---------------------------
Delphi-Quellcode:
destructor TLiveUpdate.Destroy;
begin FreeAndNil(FFiles); // Hier ist ein BreakPoint FreeAndNil(Updates); // steppe per F7 hier her // steppe weiter // jetzt dauert zwei bis drei sekunden und die Fehlermeldung kommt inherited; end; |
Re: Abgeleitet von TObject -> Destroy -> Inherited -&a
Wie erzeugst du die Objekte ? (Owner ?) :oops: :wall:
|
Re: Abgeleitet von TObject -> Destroy -> Inherited -&a
Sollen wir jetzt raten, was im Destructor von Tupdate steckt? :gruebel:
Ich nehme mal an, du erzeugst deine ObjectLists so: (?)
Delphi-Quellcode:
Wenn ja wird ganz normal der Destructor aller Elemente aufgerefuren. Und schon landen wir bei Frage nach Code dieses Destructors...
fFiles := TObjectList.Create(true);
|
Re: Abgeleitet von TObject -> Destroy -> Inherited -&a
Hi,
sorry, wusste doch, ich hab was vergessen. TUpdate hat keinen destructor. Erzeugen tu ich so:
Delphi-Quellcode:
constructor TLiveUpdate.Create;
begin FFiles := TObjectList.Create; Updates := TObjectList.Create; Searching := false; end; |
Re: Abgeleitet von TObject -> Destroy -> Inherited -&a
Zitat:
Nur mal so am Rande... Zitat:
Zitat:
Wobei ich trotz des MemLeak keinen Grund für einen Zugriff auf ein nil-Referenz sehe. Wenn du FreeAndNil wegnimmst und ein normales Free aufrufst... Ändert sich jetzt die Adresse der AV? Wenn ja greifst du noch auf die Felder zu. |
Re: Abgeleitet von TObject -> Destroy -> Inherited -&a
Moin!
Zitat:
MfG Muetze1 |
Re: Abgeleitet von TObject -> Destroy -> Inherited -&a
Zitat:
Edit: :wall: Hast recht...
Delphi-Quellcode:
constructor TObjectList.Create;
begin inherited Create; FOwnsObjects := True; end; |
Re: Abgeleitet von TObject -> Destroy -> Inherited -&a
Hi,
ich hab nun herausgefunden, dass es an FreeAndNil(Updates) liegt. Der Fehler kommt nur, wenn ich der Liste was hinzufüge. Wenn ich nun Updates := TObjectList.Create(False) mache, anstatt Updates := TObectList.Create dann bekomme ich die Meldung nicht. |
Re: Abgeleitet von TObject -> Destroy -> Inherited -&a
Jetzt kommt der Punkt, an dem hier niemand mehr etwas schreiben wird.
Und zwar weil wir nicht erraten können, ob du noch nach dem Destroy eines Updates darauf zugreifst. Auch wenn ich den Default wert von OwnsItems falsch in Erinnerung hatte, alleine das Hin & Her sollte dir klar gemacht haben, was die Eigenschaft bewirkt. Und deshalb verstehe ich einfach nicht, wie du schon wieder praktisch null (nada, nüscht, niente,...) Informationen lieferst... :freak: p.s.: Nur für den Fall dass du zu faul zum Lesen der OH warst: TObjectList.Create(False) bewirkt, dass die Elemente NICHT freigegeben werden. *sich langsam verarscht vorkommt* |
Re: Abgeleitet von TObject -> Destroy -> Inherited -&a
Zitat:
ich hab den Fehler jetzt endgültig gefunden. Es lag nicht am destruktor, sondern daran, wie ich die Items hinzugefügt habe:
Delphi-Quellcode:
Ich schätze mal das war so:
procedure TLiveUpdate.SearchUpdates;
function MD5File(const FileName: String): String; begin with THash_MD5.Create(nil) do begin Result := CalcFile(FileName, nil, fmtHex); end; end; var SL: TStringList; S: String; I: Integer; U, U2: TUpdate; begin FFiles.Clear; Updates.Clear; Searching := true; Download(URLFileList + FileListName, ExePath + FileListName); SL := TStringList.Create; try try SL.LoadFromFile(ExePath + FileListName); // Datei parsen for I := 0 to SL.Count - 1 do begin S := SL.Strings[I]; U := TUpdate.Create; // Source U.Source := Copy(S, 0, Pos(';', S) - 1); Delete(S, 1, Pos(';', S)); // Hash U.MD5 := Copy(S, 0, Pos(';', S) - 1); Delete(S, 1, Pos(';', S)); // Dest U.Dest := Copy(S, 0, Pos(';', S) - 1); Delete(S, 1, Pos(';', S)); // Size U.Size := StrToInt(Trim(S)); FFiles.Add(U); end; // Updates zusammenbauen for I := 0 to FFiles.Count - 1 do begin try if (not (FileExists(ExePath + TUpdate(FFiles.Items[I]).Dest))) then begin // Das ist das aktuelle, das funktioniert! U2 := TUpdate.Create; with TUpdate(FFiles.Items[I]) do begin U2.Size := Size; U2.Dest := Dest; U2.Source := Source; U2.MD5 := Md5; end; Updates.Add(U2); end else begin if MD5File(ExePath + TUpdate(FFiles.Items[I]).Dest) <> TUpdate(FFiles.Items[I]).MD5 then begin // Das war das alte, dass hat nicht funktioniert U2 := TUpdate(FFiles.Items[I]); Updates.Add(U2); end; end; except end; end; finally FreeAndNil(SL); end; except on E: Exception do Error('Während dem Parsen ist ein Fehler aufgetreten:' + #10#10 + '%s', [E.Message]); end; UpdateCount := Updates.Count; Searching := false; end; Ich erzeuge soviele TUpdates wie Zeilen in einer StringList und füge diese TUpdates in FFiles ein. Danach wird überprüft, ob die Hashsumme der localen Datei von der Hashsumme der aktuellen Datei unterscheidet, wenn ja, dann wird U2 das aktuelle TUpdate hinzugewiesen. Als ich nun FFiles freigebe, werden ja die ganzen Tupdates mit freigegeben, aber die TUpdates in Updates ( :roteyes: ) sind immer noch auf die Updates referenziert, die in FFiles sind, demnach kommt eine Fehlermeldung, weil die TUpdates gar nicht mehr vorhanden sind. :roteyes: Hoffe das versteht einer^^. Ausserdem brauchst du dir, Robert, nicht verarscht vorkommen, denn ich bin ma wieder auffem Schlauch gestanden ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz