![]() |
Verständnisfrage Memory-Leak einfacher String
Hallo zusammen,
ich habe mir angewöhnt immer mit
Delphi-Quellcode:
zu arbeiten.
ReportMemoryLeaksOnShutdown := (DebugHook <> 0);
Neuerdings bekomme ich nach Programmende manchmal, also unter noch ungeklärten Bedinungen die Meldung, dass ein kleines Speicherloch vorhanden ist und die Ergänzung "String". Ich dachte immer, die Freigabe von Strings würde Delphi automatisch erledingen, deshalb kann ich mir nicht erklären, wieso diese Meldung überhaupt angezeigt wird (und ich habe auch keine Hoffung, dieses Leck zu finden, denn mir fehlt einfach der Ansatzspunkt). Könnt ihr mir da genaueres zu sagen? Dank und Gruß Jürgen |
Re: Verständnisfrage Memory-Leak einfacher String
Delphi gibt die Strings an sich schon frei, sobald du aber mit Pointern auf Strings arbeitest, wirds haarig.
Mit folgendem Code bekommt man leicht ein Memory-Leak, obwohl man im OnDestroy die Pointer wieder freigibt.
Delphi-Quellcode:
Das Memory-Leak kann man umgehen, wenn man z.B. vor dem Dispose(p) in Zeile 28 folgende Zeile einfügt
var
aList : TList; procedure TForm1.FormCreate(Sender: TObject); var p: PString; i: integer; begin aList := TList.Create; for i:=0 to 10 do begin New(p); p^ := 'Test - 123'; aList.Add(p); end; end; procedure TForm1.FormDestroy(Sender: TObject); var p: PString; i: integer; begin for i:=0 to aList.Count-1 do begin p := aList[i]; // mit Dispose wird zwar der Pointer wieder freigegeben, aber // der Inhalt ('Test - 123') vom Anfang wird nicht wieder // Freigegeben. Dispose(p); end; aList.Clear; aList.Free; end;
Delphi-Quellcode:
Allgemein hat Delphi auch eine Funktion dafür: Finalize();
{ ... }
p^ := ''; // hiermit wird der String an sich wieder freigegeben Dispose(p); end; { ... } Aus der Delphi-Hilfe: Zitat:
|
Re: Verständnisfrage Memory-Leak einfacher String
Danke für Deine ausführliche Beschreibung,
habe auf jeden Fall was dazugelernt. Ich arbeite zwar selbst nicht mit Pointern auf Strings, aber vielleicht ist eine meiner Fremd-Komponenten die Ursache. Schade, dass ich es bis jetzt nicht gezielt reproduzieren konnte, dann wäre ich einen Schritt weiter. Gruß Jürgen |
Re: Verständnisfrage Memory-Leak einfacher String
Zitat:
Ist aber egal, da der Speicher mit Programmende ohnehin freigegeben wird. Gruß Peter |
Re: Verständnisfrage Memory-Leak einfacher String
Zitat:
Hat man z.B. als Datenstruktur einen Record mit Strings als Felder, dann muss man diese Strings bei der Freigabe auf einen Leerstring setzen. |
Re: Verständnisfrage Memory-Leak einfacher String
Hallo,
Zitat:
![]() Gruß xaromz |
Re: Verständnisfrage Memory-Leak einfacher String
Ok für dynamische Arrays, was ein String ja auch ist, ist dies vielleicht doch die bessere Wahl.
Ich habe es ehrlich gesagt bisher auf einen Leerstring gesetzt und hatte auch keine Leaks mehr. |
Re: Verständnisfrage Memory-Leak einfacher String
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:45 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-2025 by Thomas Breitkreuz