AGB  ·  Datenschutz  ·  Impressum  







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

Brauche Hilfe bei der Fehlersuche.

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

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

AW: Brauche Hilfe bei der Fehlersuche.

  Alt 26. Aug 2019, 21:30
Zitat:
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.
Das ist auch grundsätzlich korrekt, nur brauchst/darfst du die Stringlist nicht vorher erzeugen, denn das macht ja deine Funktion.

Wie aber gubbe schon sagte, sehr gefährlich das richtig frei zugeben!
Besser:

Delphi-Quellcode:
var
  MyStringList: TStringList;

begin
  MyStringList := TStringList.Create;
  try
    MeineProc(MyStringList);
    // Weitere Anweisungen mit der gefüllten Stringlist
    ...

  finally
    MyStringList.Free; // reicht aus
  end;
end;
so ungefähr

Ich sehe gerade, das hatte gubbe auch schon (besser) geschrieben...
Hartmut
*

Geändert von HHennig (26. Aug 2019 um 21:35 Uhr)
  Mit Zitat antworten Zitat
Beach

Registriert seit: 3. Mär 2019
Ort: Kappel
46 Beiträge
 
FreePascal / Lazarus
 
#12

AW: Brauche Hilfe bei der Fehlersuche.

  Alt 26. Aug 2019, 21:34
[...]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;
[...]
Ich glaube das war es jetzt.
Habe das so umgebaut und bei mehreren Tests war das Ergebnis jeweils "0 unfreed Memory Blocks"
Und was neues gelernt habe ich dabei auch.

Eine Frage noch.
Wann nutze ich FreeAndNil() und wann .Free ?

Vielen Dank an alle. Nun kann ich weiter basteln.
Die nächsten Fragen kommen bestimmt
MfG Jürgen
  Mit Zitat antworten Zitat
HHennig

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

AW: Brauche Hilfe bei der Fehlersuche.

  Alt 26. Aug 2019, 21:41
nur Free machst du, wenn wie in meinem Beispiel die Objektvariable lokal angelegt wurde. Nach dem Verlassen des Blocks ist sie automatisch undefiniert (und ihr Speicher verloren, wenn nicht vorher freigegeben!)
FreeAndNil wenn nicht ganz klar ist, ob die Objektvariable evtl. nach der Freigabe noch irgendwo verwendet werden könnte. Wenn man dann vor jeder Verwendung auf nil abprüft, sollten ungültige Zugriffe (weil die Variable schon zerstört wurde) weitgehend ausgeschlossen sein.
Hartmut
*
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#14

AW: Brauche Hilfe bei der Fehlersuche.

  Alt 27. Aug 2019, 06:28
Moin...
Zitat:
Eindeutiger ist es, eine Stringliste als Übergabeparameter der Funktion zu deklarieren.
...nicht unbedingt. Aus dem Namen sollte hervorgehen, das ein Objekt (in diesen Falle eine TStringList) erzeugt wird.
Bsp:
function CreateAndFillBlubbList(Bla: Integer): TStringList;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#15

AW: Brauche Hilfe bei der Fehlersuche.

  Alt 27. Aug 2019, 13:11
Zitat:
FreeAndNil wenn nicht ganz klar ist, ob die Objektvariable evtl. nach der Freigabe noch irgendwo verwendet werden könnte
Und wenn du an diesen Punkt bist, weißt du, dass du schlechten Code geschrieben hast. Wenn man sauber programmiert, ist FreeAndNil nicht nötig.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
647 Beiträge
 
Delphi 11 Alexandria
 
#16

AW: Brauche Hilfe bei der Fehlersuche.

  Alt 27. Aug 2019, 17:18
Ich glaube das war es jetzt.
Habe das so umgebaut und bei mehreren Tests war das Ergebnis jeweils "0 unfreed Memory Blocks"
Und was neues gelernt habe ich dabei auch.
Noch um es dir klar zu machen wieso das nicht ging:

Eine Delphiklassenvariable ist im Prinzip ein Pointer auf einen Speicherbereich, in dem die Klasse erzeugt wurde. Wenn du nun also in deiner Funktion eine weitere Stringlist erstellst, wird diese einen anderen Speicherbereich haben, also ein neuer Pointer darauf. Durch die Rückgabe dieser erzeugten Klasse, gibst du also nicht den Speicherinhalt zurück, sondern den Pointer auf diesen Speicher. Damit ist deine ausserhalb der Funktion erstellte Variable nicht mehr ein Pointer auf diese Klasse, sondern hat nun den Pointer aus der Funktion zugewiesen. Sie sieht also nun das Objekt der in der Funktion erzeugten Stringlist. Der vorherige Pointer dieser Variable ist nun verloren und der allozierte Speicher kann nicht mehr freigegeben werden, da nun dein Free die in der Funktion erzeugte Klasse freigibt und nicht die erste.

Gewöhn dir aber bitte an, wann immer du ein Objekt erstellst, dieses mit einem try/finally zu schützen. Nur so wird deine Klasse sauber freigeben, wenn innerhalb des Create und Free eine Exception auftritt.

Delphi-Quellcode:
x := TMeinObjekt.Create;
try
  x.TueIrgendwas;
finally
  x.Free; // Kannst auch FreeAndNil verwenden. Ist im prinzip das Selbe, nur dass danach x = nil ist.
end;

Geändert von Rolf Frei (27. Aug 2019 um 17:22 Uhr)
  Mit Zitat antworten Zitat
hoika

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

AW: Brauche Hilfe bei der Fehlersuche.

  Alt 27. Aug 2019, 17:28
Hallo,
Zitat:
Kannst auch FreeAndNil verwenden. Ist im prinzip das Selbe, nur dass danach x = nil ist.
Nicht ganz.

Folgendes geht:
FreeAndNil(x);
FreeAndNil(x);

Folgendes nicht:
x.Free;
x.Free;

FreeAndNil prüft, ob die Variable nicht bereits schon nil ist.
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von gubbe
gubbe

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

AW: Brauche Hilfe bei der Fehlersuche.

  Alt 27. Aug 2019, 17:33

FreeAndNil prüft, ob die Variable nicht bereits schon nil ist.
Das macht Free auch.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 20:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz