Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   FreePascal Speicher Freigeben (https://www.delphipraxis.net/163458-speicher-freigeben.html)

stiftII 29. Sep 2011 12:45

Speicher Freigeben
 
Hallo,

ich habe folgende Funktion:
Delphi-Quellcode:
function ExtraColumsStringsDB(firma:string):TStringlist;
var
  Temp: Array Of TColumn;
  i: integer;
begin
     Result := TStringList.Create;
     Temp := GetExtraFields(firma);
     for i:=0 to high(Temp) do
     begin
       result.Add(Temp[i].FieldName );
     end;
end;
Aufgerufen wird diese zB so:
Delphi-Quellcode:
ExtraColumsStringsDB('name').count
Allerdings ist mir aufgefallen, dass bei dieser Vorgehensweise der verwendete Speicher der Funktion niemals freigegeben werden kann. (FPC hat ja keinen Garbage Collector)

Wenn man den Speicher in der Funktion freigeben würde, könnte man den Rückgabewert (TStringlist) ja niemals benutzen.

Gibt es irgendeine Möglichkeit diese nicht mehr verwendeten Variablen nach Ausführung der Funktion wieder freizugeben ?

Grüße
stiftII

Luckie 29. Sep 2011 12:48

AW: Speicher Freigeben
 
So was löst man in der Regel, in dem der Aufrufer das Objekt zur Verfügung stellt und es der Routine übergibt.

Alaitoc 29. Sep 2011 12:50

AW: Speicher Freigeben
 
Mach es doch so, dass eine StringList der Methode übergeben werden muss.
Dann noch überprüfen ob die überhaupt existiert, sie vll. clearen und mit Werten füllen.

MfG Alaitoc

Edith sagt: "Luckie war schneller".

Bernhard Geyer 29. Sep 2011 12:50

AW: Speicher Freigeben
 
oder den Funktionsnamen so wählen das klar ist das der Aufrufer aufräumen muss. z.B. CreateExtraColumsStrings

angos 29. Sep 2011 12:51

AW: Speicher Freigeben
 
Hi,

ich würde das Ganze ein wenig anders angehen (auch wenn schon Antworten da sind, hier die mögliche Lösung):


Delphi-Quellcode:
function ExtraColumsStringsDB(firma:string; const ASL: TStringlist): Boolean;
var
  Temp: Array Of TColumn;
  i: integer;
begin
  try
    Result := True;

    Temp := GetExtraFields(firma);
    for i:=0 to high(Temp) do
    begin
      ASL.Add(Temp[i].FieldName );
    end;
  except
    Result := False;
  end;
end;

procedure dosomething;
var
  SL:TStringList;
begin
  SL := TStringList.Create;
  try
    ExtraColumsStringsDB('EINEFIRMA', SL);
  finally
    SL.Free;
  end;
end;

DeddyH 29. Sep 2011 12:53

AW: Speicher Freigeben
 
Die Liste als Parameter zu übergeben ist trotzdem die bessere Option, da sonst bei mehrfachem Aufruf der Funktion auch mehrere Instanzen erzeugt werden. Wenn man dann nicht jede in einer Variablen speichert und freigibt hat man die schönsten Speicherlecks produziert.

p80286 29. Sep 2011 13:40

AW: Speicher Freigeben
 
Zitat:

Zitat von DeddyH (Beitrag 1127467)
Wenn man dann nicht jede in einer Variablen speichert und freigibt hat man die schönsten Speicherlecks produziert.

Das würde ich als selbsverständlich vorraussetzen.

Gruß
K-H

Luckie 29. Sep 2011 13:49

AW: Speicher Freigeben
 
Zitat:

Zitat von angos (Beitrag 1127466)
ich würde das Ganze ein wenig anders angehen (auch wenn schon Antworten da sind, hier die mögliche Lösung):

Und wo ist das jetzt anders, als zu den bisherigen Vorschlägen: Aufrufer erzeugt Objekt und übergibt es als Parameter an die Routine.

DeddyH 29. Sep 2011 14:00

AW: Speicher Freigeben
 
Zitat:

Zitat von p80286 (Beitrag 1127484)
Zitat:

Zitat von DeddyH (Beitrag 1127467)
Wenn man dann nicht jede in einer Variablen speichert und freigibt hat man die schönsten Speicherlecks produziert.

Das würde ich als selbsverständlich vorraussetzen.

Gruß
K-H

Negativbeispiel: http://www.delphipraxis.net/1099023-post9.html (Handler.GetAllDataSets liefert eine Stringliste)

r2c2 29. Sep 2011 19:21

AW: Speicher Freigeben
 
Und wenn man den Parameter noch als TStrings (statt TStringList) deklariert, kann man sogar so Spielchen machen wie Memo.Lines übergeben...

mfg

Christian


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:07 Uhr.
Seite 1 von 3  1 23      

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