AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen FreePascal Brauche Hilfe bei der Fehlersuche.

Brauche Hilfe bei der Fehlersuche.

Ein Thema von Beach · begonnen am 26. Aug 2019 · letzter Beitrag vom 27. Aug 2019
Antwort Antwort
Seite 1 von 2  1 2   
Beach

Registriert seit: 3. Mär 2019
Ort: Hunsrück
41 Beiträge
 
FreePascal / Lazarus
 
#1

Brauche Hilfe bei der Fehlersuche.

  Alt 26. Aug 2019, 18:49
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.
Miniaturansicht angehängter Grafiken
lazarus_konf.jpg  
MfG Jürgen
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.657 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Brauche Hilfe bei der Fehlersuche.

  Alt 26. Aug 2019, 18:58
.. kannst Du die Auswertefunktion hier zeigen?

Grüße
Klaus
Klaus

Geändert von Klaus01 (26. Aug 2019 um 19:03 Uhr)
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.540 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Brauche Hilfe bei der Fehlersuche.

  Alt 26. Aug 2019, 18:59

In der Zeile 321 der mainform.pas wird eine StringList mittels Create erstellt. (und am Ende der Funktion mit FreeAndNil() wieder Freigegeben¿? )
Bist du auch sicher, das du durch die Zeilen kommst, wo das Freigeben passiert?
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Beach

Registriert seit: 3. Mär 2019
Ort: Hunsrück
41 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Brauche Hilfe bei der Fehlersuche.

  Alt 26. Aug 2019, 19:35
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;
MfG Jürgen
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.123 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Brauche Hilfe bei der Fehlersuche.

  Alt 26. Aug 2019, 20:02
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:
Bin dankbar für jeden Tipp um meinen Fehler zu finden.
Code soweit ausklammern, bis kein Fehler erzeugt wird.
Dann schrittweise wieder rein, bis der Fehler wieder da ist.

Ich nehme mal folgendes an.
Fehler
Delphi-Quellcode:
  strListCalc := TStringList.Create;
  ZeissCFG := TClassZeissCFG.Create;
  StrListCalc := ZeissCFG.BuildNewFile(CFGValues, ValuesX, ValuesY, ValuesZ, DataLoaded);
  FreeAndNil(ZeissCFG);
  FreeAndNil(strListCalc);
kein Fehler
Delphi-Quellcode:
  strListCalc := TStringList.Create;
  ZeissCFG := TClassZeissCFG.Create;
  FreeAndNil(ZeissCFG);
  FreeAndNil(strListCalc);
Heiko

Geändert von hoika (26. Aug 2019 um 20:05 Uhr)
  Mit Zitat antworten Zitat
Beach

Registriert seit: 3. Mär 2019
Ort: Hunsrück
41 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Brauche Hilfe bei der Fehlersuche.

  Alt 26. Aug 2019, 20:04
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;
MfG Jürgen
  Mit Zitat antworten Zitat
HHennig

Registriert seit: 16. Feb 2007
Ort: Pforzheim
51 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Brauche Hilfe bei der Fehlersuche.

  Alt 26. Aug 2019, 20:05
try..finally könnte evtl. schon die Lösung sein:

Delphi-Quellcode:
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;
Ja, und inzwischen gab es schon einen Vorredner...geh seinem Verdacht ruhig auch nochmal auf den Grund!
Hartmut
*
  Mit Zitat antworten Zitat
HHennig

Registriert seit: 16. Feb 2007
Ort: Pforzheim
51 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Brauche Hilfe bei der Fehlersuche.

  Alt 26. Aug 2019, 20:07
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!
Hartmut
*
  Mit Zitat antworten Zitat
Beach

Registriert seit: 3. Mär 2019
Ort: Hunsrück
41 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Brauche Hilfe bei der Fehlersuche.

  Alt 26. Aug 2019, 20:15
Mit try...finally hatte ich schon probiert, ohne Erfolg.

Die Funktion BuildNewFile ist, laut ausklammern, der Übeltäter.

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!
Dann habe ich da wohl ein Verständnisproblem.
Ich dachte, das ich, wenn ich eine StringList zurückliefere, diese auch in eine StringList Übergeben muss.
MfG Jürgen
  Mit Zitat antworten Zitat
gubbe

Registriert seit: 8. Okt 2005
Ort: Schleswig-Holstein
37 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Brauche Hilfe bei der Fehlersuche.

  Alt 26. Aug 2019, 20:16
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:
StrListCalc := TStringList.Create;
ZeissCFG.BuildNewFile(StrListCalc, CFGValues, ValuesX, ValuesY, ValuesZ, DataLoaded);
...
StrListCalc.Free;
Die Funktion müsste natürlich entsprechend angepasst werden.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 03:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf