![]() |
Brauche Hilfe bei der Fehlersuche.
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,
habe für meine Arbeit ein kleines Programm geschrieben was auch prinzipiell macht was es soll. Aber nach dem Aufruf einer auswertefunktion bekomme ich nach Beenden des Programms die Meldung im Anhang. Dort heißt es das "1 unfreed Memory Block" Übrigbleibt. Führe ich die Auswertung mit allen Daten durch, bleiben deutlich mehr (hatte schon 64) "unfreed Memory Blocks" über. Wie gehe ich nun für die Fehlersuche vor? In der Zeile 321 der mainform.pas wird eine StringList mittels Create erstellt. (und am Ende der Funktion mit FreeAndNil() wieder Freigegeben¿? ) Bin dankbar für jeden Tipp um meinen Fehler zu finden. |
AW: Brauche Hilfe bei der Fehlersuche.
.. kannst Du die Auswertefunktion hier zeigen?
Grüße Klaus |
AW: Brauche Hilfe bei der Fehlersuche.
Zitat:
|
AW: Brauche Hilfe bei der Fehlersuche.
Die Zeile 321:
strListCalc := TStringList.Create;
Delphi-Quellcode:
procedure TForm1.alCalcExecute(Sender: TObject);
var StrListCalc: TStringList; begin strListCalc := TStringList.Create; ZeissCFG := TClassZeissCFG.Create; StrListCalc := ZeissCFG.BuildNewFile(CFGValues, ValuesX, ValuesY, ValuesZ, DataLoaded); if CheckForSelectedFiles() then begin if SaveDialog1.Execute then begin if SaveDialog1.FileName <> '' then begin StrListCalc.SaveToFile(SaveDialog1.FileName); ShowMessage('Neue CFG Datei gespeichert!'); end; end else begin ShowMessage('Datei NICHT gespeichert!'); end; end; FreeAndNil(ZeissCFG); FreeAndNil(strListCalc); end; |
AW: Brauche Hilfe bei der Fehlersuche.
Hallo,
kann es sein, dass StrListCalc := ZeissCFG.BuildNewFile(CFGValues, ValuesX, ValuesY, ValuesZ, DataLoaded); intern auch eine TStringList erzeugt und zurückgibt? Um zu Deiner Frage zu kommen Zitat:
Dann schrittweise wieder rein, bis der Fehler wieder da ist. Ich nehme mal folgendes an. Fehler
Delphi-Quellcode:
kein Fehler
strListCalc := TStringList.Create;
ZeissCFG := TClassZeissCFG.Create; StrListCalc := ZeissCFG.BuildNewFile(CFGValues, ValuesX, ValuesY, ValuesZ, DataLoaded); FreeAndNil(ZeissCFG); FreeAndNil(strListCalc);
Delphi-Quellcode:
strListCalc := TStringList.Create;
ZeissCFG := TClassZeissCFG.Create; FreeAndNil(ZeissCFG); FreeAndNil(strListCalc); |
AW: Brauche Hilfe bei der Fehlersuche.
Ja. Die Funktion soll eine StringList zurückgeben.
Delphi-Quellcode:
function TClassZeissCFG.BuildNewFile(CFG: TCFGValues; XStrList: TRenishawValues;
YStrList: TRenishawValues; ZStrList: TrenishawValues; DataLoaded: array of boolean): TStringList; var i: integer; const xpc = 1; ypc = 2; zpc = 3; begin I := 0; Result := TStringList.Create; Result.Add(ArrayToStr(CFG.Text)); Result.Add(ArrayToStr(CFG.Axis_x)); Result.Add(ArrayToStr(CFG.Axis_y)); Result.Add(ArrayToStr(CFG.Axis_Z)); Result.Add(ArrayToStr(CFG.Tilt_y)); Result.Add(ArrayToStr(CFG.Tilt_x)); Result.Add(ArrayToStr(CFG.Tilt_const)); // Wenn Renishaw Daten geladen wurden, werden diese genommen. // Ansonsten die Original Daten aus der CFG Datei // X-Achse if DataLoaded[xpc] then begin Result.Add('komp_x ' + IntToStr(XStrList.TargetCount + 2)); Result.Add('-99999.999 0'); for i := 0 to XStrList.TargetCount - 1 do begin Result.Add(XStrList.Targets[i] + ' ' + XStrList.Deviation[i][2]); end; Result.Add('99999.999 0'); end else begin Result.Add('komp_x ' + IntToStr(cfg.Comp_count_x)); for i := 0 to cfg.Comp_count_x - 1 do begin Result.Add(cfg.Comp_x[i][0] + ' ' + cfg.Comp_x[i][1]); end; end; // Y-Achse if DataLoaded[ypc] then begin Result.Add('komp_Y ' + IntToStr(YStrList.TargetCount + 2)); Result.Add('-99999.999 0'); for i := 0 to YStrList.TargetCount - 1 do begin Result.Add(YStrList.Targets[i] + ' ' + YStrList.Deviation[i][2]); end; Result.Add('99999.999 0'); end else begin Result.Add('komp_y ' + IntToStr(cfg.Comp_count_y)); for i := 0 to cfg.Comp_count_y - 1 do begin Result.Add(cfg.Comp_y[i][0] + ' ' + cfg.Comp_y[i][1]); end; end; // Z-Achse if DataLoaded[zpc] then begin Result.Add('komp_z ' + IntToStr(ZStrList.TargetCount + 2)); Result.Add('-99999.999 0'); for i := 0 to ZStrList.TargetCount - 1 do begin Result.Add(ZStrList.Targets[i] + ' ' + ZStrList.Deviation[i][2]); end; Result.Add('99999.999 0'); end else begin Result.Add('komp_z ' + IntToStr(cfg.Comp_count_z)); for i := 0 to cfg.Comp_count_Z - 1 do begin Result.Add(cfg.Comp_Z[i][0] + ' ' + cfg.Comp_Z[i][1]); end; end; end; |
AW: Brauche Hilfe bei der Fehlersuche.
try..finally könnte evtl. schon die Lösung sein:
Delphi-Quellcode:
Ja, und inzwischen gab es schon einen Vorredner...geh seinem Verdacht ruhig auch nochmal auf den Grund!
procedure TForm1.alCalcExecute(Sender: TObject);
var StrListCalc: TStringList; begin strListCalc := TStringList.Create; ZeissCFG := TClassZeissCFG.Create; try //<==[INDENT] StrListCalc := ZeissCFG.BuildNewFile(CFGValues, ValuesX, ValuesY, ValuesZ, DataLoaded); if CheckForSelectedFiles() then begin if SaveDialog1.Execute then begin if SaveDialog1.FileName <> '' then begin StrListCalc.SaveToFile(SaveDialog1.FileName); ShowMessage('Neue CFG Datei gespeichert!'); end; end else begin ShowMessage('Datei NICHT gespeichert!'); end; end; [/INDENT] finally //<<== FreeAndNil(ZeissCFG); FreeAndNil(strListCalc); end; end; |
AW: Brauche Hilfe bei der Fehlersuche.
Wenn deine Funktion eine Stringlist zurückgibt, ist das vorherige Erzeugen ausserhalb der Funktion definitiv das Problem; der angelegte Speicher wird nicht freigegeben da der Objektzeiger durch deine Funktionsrückgabe umgebogen wurde!
|
AW: Brauche Hilfe bei der Fehlersuche.
Mit try...finally hatte ich schon probiert, ohne Erfolg.
Die Funktion BuildNewFile ist, laut ausklammern, der Übeltäter. Zitat:
Ich dachte, das ich, wenn ich eine StringList zurückliefere, diese auch in eine StringList Übergeben muss. |
AW: Brauche Hilfe bei der Fehlersuche.
Das zeigt ganz gut, warum es keine so gute Idee ist, wenn eine Funktion eine Stringlist erstellt und zurückgibt. Es ist unklar, wessen Aufgabe es ist, sie wieder freizugeben. Eindeutiger ist es, eine Stringliste als Übergabeparameter der Funktion zu deklarieren.
Code:
Die Funktion müsste natürlich entsprechend angepasst werden.
StrListCalc := TStringList.Create;
ZeissCFG.BuildNewFile(StrListCalc, CFGValues, ValuesX, ValuesY, ValuesZ, DataLoaded); ... StrListCalc.Free; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 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 by Thomas Breitkreuz