Einzelnen Beitrag anzeigen

Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.337 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Funktion mit Rückgabe TStrings bzw TMemIniFile

  Alt 4. Jun 2017, 11:16
Meine Hilfe (XE3) kennt TIniFile.GetStrings nicht.
Ich setze mal voraus, dass damit alle Textzeilen nach SL kopiert werden.

Mit SL.Free wird diese StringList wieder freigegeben.
Da Result und SL den gleichen Speicherbereich referenzieren, wird damit auch Result freigebenen.
Somit gibst Du einen gelöschten/ungültigen Verweis aus Deiner Funktion heraus.

Du könntest 3 Lösungsansätze wählen:

1) Du verzichtest auf SL.Free und gibst somit eine existierende Stringlist heraus.
Dann solltest Du aber das Ergebnis an anderer Stelle wieder freigeben, damit Du nicht ein Memoryleak erzeugst und den Speicher vollmüllst.

2) Du erzeugst Deine SL vor der Funktion und übergibst diese als Parameter.
Dann hat die Funktion (oder Prozedur) nur die Aufgabe, SL zu füllen, aber nicht zu erzeugen.
Der Vorteil zu 1) ist, dass klarer ist, wo SL wieder freigegeben werden muss.

3) Du könntest aus der Funktion auch nur den reinen Text als String heraus geben.
Delphi-Quellcode:
function MyFunc: String;
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  try
    IniFile_.GetStrings(sl); // TMemIniFile
    ...
    ...
    Result := sl.Text;
  finally
    sl. Free;
end;
In dem Fall könntest Du einfach den Text weiter verarbeiten und musst Dioch nicht um die Speicherfreigabe kümmern.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli ( 4. Jun 2017 um 11:19 Uhr)
  Mit Zitat antworten Zitat