![]() |
Memoryleak oder doch nicht?
Die Meldung.
Zitat:
Wo oder was ist der Leak UnicodeString? Aber wie soll dieser entstehen wenn ich doch die Classe beim beenden freigebe?
Delphi-Quellcode:
Noch mehr kann ich nicht tun.
destructor TSkinEngine.Destroy;
begin if Assigned(SkinConfig) then SkinConfig.free; SkinLoaded := False; SkinEngine := nil; inherited; end; Und hier wird das File geschlossen.
Delphi-Quellcode:
noch bevor die Anwendung beendet wird.
procedure TSkinConfig.FBuffin(FileName: string);
var sBuffer: string; begin if not FExist(FileName) then Exit; Assignfile(ParseFile, FileName); reset(ParseFile); try try while not eof(ParseFile) do begin ReadLN(ParseFile, sBuffer); AppendToLinkedList(nReading, sBuffer); inc(nReading); end; except raise Exception.Create(SysErrorMessage(GetLastError)); end; finally nReading := 0; sBuffer := ''; CloseFile(ParseFile); end; end; Was will er mir jetzt mit dem FBuffin sagen? EDIT: Dieser string wird aus der Textdatei geladen 'WARNING: bla, bla!" Nun die Datei wird ordnungsgemäß geschlossen und die Classe freigegeben verstehe wer will. Der String existiert doch dann gar nicht mehr. gruss |
AW: Memoryleak oder doch nicht?
Also gemäß des Callstacks geht es um den Inhalt von sBuffer. Innerhalb der FBuffin Methode läuft da alles gut, also bleibt nur die Frage: Was wird in
Delphi-Quellcode:
damit gemacht?
AppendToLinkedList(nReading, sBuffer)
:glaskugel: Meine Vermutung: dort wird irgendwie der RefCount des strings aus dem Gleichgewicht gebracht. |
AW: Memoryleak oder doch nicht?
Zitat:
Delphi-Quellcode:
Es werden nur die Zuweisungen aktualisiert.
procedure TSkinConfig.AppendToLinkedList(nReading: Integer; sBuffer: string);
begin New(FPBuffer); if nReading = 0 then Begin New(FToPBuffer); LineStart := FToPBuffer; LineStart^.Nr := 0; end; FPBuffer^.Nr := nReading; FPBuffer^.Str := sBuffer; LineStart^.Max := nReading; FToPBuffer^.Ptr := FPBuffer; FToPBuffer := FPBuffer; end; EDIT:
Delphi-Quellcode:
PParseFile = ^TParseFile;
TParseFile = record Nr :Integer; Str : string; Ptr : PParseFile; Max : Integer; end;
Delphi-Quellcode:
gruss
LineStart : PParseFile;
FPBuffer : PParseFile; FToPBuffer : PParseFile; |
AW: Memoryleak oder doch nicht?
Dann liegt wohl da der Hund begraben:
Delphi-Quellcode:
FPBuffer^.Str := sBuffer;
|
AW: Memoryleak oder doch nicht?
Zitat:
Beides sind string. gruss |
AW: Memoryleak oder doch nicht?
Wann und vor allem wie gibst Du
Delphi-Quellcode:
wieder frei?
FPBuffer^.Str := sBuffer;
|
AW: Memoryleak oder doch nicht?
Zitat:
Delphi-Quellcode:
EDIT:
// Resourcen Freigeben
Dispose(FPBuffer); FPBuffer := nil; Dispose(LineStart); LineStart := nil; Result := True; Mit new erstellt und Dispose freigegeben. gruss |
AW: Memoryleak oder doch nicht?
Da liegt der Hund begraben.....
Der String wird nich freigegeben. mach einfach
Delphi-Quellcode:
Wenn Du nur den Speicher freigibst werden die Strings nicht gelöscht.
finalize(FPbuffer^);
//oder FPBuffer^.Str := nil; Dispose(FPBuffer); FPBuffer := nil; Aus der Hilfe zu finalize Zitat:
|
AW: Memoryleak oder doch nicht?
Dann werde ich es mal so bearbeiten wie von dir vorgeschlagen.. Danke.
Hmmm dachte eigentlich ein Dispose würde reichen. Ok wieder was gelernt. gruss |
AW: Memoryleak oder doch nicht?
Jetzt habe ich nur noch eins.
Dann ist alles bereinigt. Zitat:
Delphi-Quellcode:
gruss
// Resourcen Freigeben
finalize(FPbuffer^); Dispose(FPBuffer); FPBuffer := nil; finalize(LineStart^); Dispose(LineStart); LineStart := nil; Result := True; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:13 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 by Thomas Breitkreuz