AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein TStringList und MemoryLeak (FastMM)
Thema durchsuchen
Ansicht
Themen-Optionen

TStringList und MemoryLeak (FastMM)

Ein Thema von Schwedenbitter · begonnen am 5. Jul 2010 · letzter Beitrag vom 6. Jul 2010
Antwort Antwort
Seite 1 von 2  1 2      
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#1

TStringList und MemoryLeak (FastMM)

  Alt 5. Jul 2010, 17:07
Hallo,

bei folgendem Code:
Delphi-Quellcode:
// Einstellungen aus Registry laden
Procedure TSettings.Load;
Var
  S : String;
Begin
  With TRegistry.Create(KEY_READ) Do
  Try
    RootKey:=HKEY_CURRENT_USER;
    Try
      If OpenKeyReadOnly(AdvoPfad) Then
      Begin
        ...
        S:=ReadString( 'aPopup' );   // Zu blockende Fenster
        If S = 'Then FPopBlock.Text:='Nur ein Fenster'
        Else FPopBlock.Text:=S;// <- genau hier besteht das Problem
        ...
        CloseKey;
    Except End;
  Finally
    Free;
  End;
End;
erhalte ich mit FastMM folgende Meldung:
Code:
This application has leaked memory. The small block leaks are (excluding expected leaks registered by pointer):

5 - 12 bytes: AnsiString x 1
13 - 20 bytes: AnsiString x 2
21 - 36 bytes: AnsiString x 1, Unknown x 1
53 - 68 bytes: TStringList x 1
wobei die letzte Meldung bzgl. der TStringList lt. konkreter Beschreibung von FastMM wohl dem mitgegebenen Code von Delphi anzulasten ist.
Wenn ich nun die beiden Zeilen mit den Zuweisungen an FPopBlock.Text (=TStringList) auskommentiere, bekomme ich nur noch die letzte Meldung.

Was hat das mit dem AnsiString zu bedeuten und wie bekomme ich es (wieder) weg?

Ich habe bereits die Hilfe benutzt. Das Problem i.V.m. FastMM scheint niemand zu haben. Ich habe nur herausgefunden, dass man wohl manchmal auch Strings leeren muss mit S:='';. Aber selbst, wenn ich das am Schluss einfüge, bleiben die Meldungen. Und ich verstehe auch nicht, warum er über einen AnsiString meckert, wo doch S eindeutig vom Typ String ist.

Gruß, Alex
Alex Winzer
  Mit Zitat antworten Zitat
Mschmidt

Registriert seit: 4. Jul 2010
Ort: Berlin
62 Beiträge
 
Delphi XE2 Professional
 
#2

AW: TStringList und MemoryLeak (FastMM)

  Alt 5. Jul 2010, 17:22
entweder bin ich blind - ich sehe in deinem Quellcode nichts von "TStringlist". Ist es wirklich die Stelle?
Mschmidt
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#3

AW: TStringList und MemoryLeak (FastMM)

  Alt 5. Jul 2010, 17:23
Ich denke FPopupBLock ist die TStringListe..
Lars
  Mit Zitat antworten Zitat
hoika

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

AW: TStringList und MemoryLeak (FastMM)

  Alt 5. Jul 2010, 17:33
Hallo,

ich würde mal die StringList wieder freigeben.


Heiko
Heiko
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#5

AW: TStringList und MemoryLeak (FastMM)

  Alt 5. Jul 2010, 18:28
Danke für die Ideen. Ich hatte aber bereits geschrieben, dass es definitiv an diesen Zeilen liegt!
Hallo,
ich würde mal die StringList wieder freigeben.
Heiko
Delphi-Quellcode:
// Alles initialisieren
Constructor TSettings.Create;
Begin
  ...
  FPopBlock:=TStringList.Create;
  FPopBlock.Clear;
  ..
End;

Procedure TSettings.Load; // <- steht bereits oben

// Alles freigeben
Destructor TSettings.Destroy;
Begin
  FPopBlock.Free;
End;
Mehr geht leider nicht! Ich hatte ja geschrieben, dass
Zitat von Schwedenbitter:
Wenn ich nun die beiden Zeilen mit den Zuweisungen an FPopBlock.Text (=TStringList) auskommentiere, bekomme ich nur noch die letzte Meldung.
Da in meinem Hauptprogramm im OnDestroy ein TSettings.Free steht, wird die TStringList also freigegeben. FastMM meckert diese auch nicht an!
FastMM meckert den AnsiString an.

Gruß, Alex
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#6

AW: TStringList und MemoryLeak (FastMM)

  Alt 5. Jul 2010, 18:39
Zitat:
Da in meinem Hauptprogramm im OnDestroy ein TSettings.Free steht, wird die TStringList also freigegeben.
Mit Debugger kontrolliert? Sorry für die dumme Frage...
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#7

AW: TStringList und MemoryLeak (FastMM)

  Alt 5. Jul 2010, 18:46
Ein gefüllte TStringList enthält ja AnsiStrings (falls Delphi Version < 2010).
Daher ist es vollkommen logisch, dass eine nicht freigegebene StringList meistens auch weiteren Speicher für AnsiStrings reserviert hält.

Die Speicherlecks mit den AnsiStrings sind also nur eine Folge der nicht freigegebenen StringList.

Bei der Jagd auf Speicherlecks sollte man sich immer zuerst auf die Suche nach den grössten Objekten machen.
So bald man das Leck schliesst verschwinden damit häufig auch kleinere, untergeordnete Lecks.
Andreas
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#8

AW: TStringList und MemoryLeak (FastMM)

  Alt 5. Jul 2010, 19:55
Ihr habt ja so Recht!

Ich habe dummer Weise mein TSettings von nichts abgeleitet. Der Compiler sieht damit offenbar keine Notwendigkeit den Destructor auszuführen. Wie auch immer.
Abhilfe hat nun geschaffen, dass ich mein TSettings von TObject abgeleitet habe. Ferner habe ich den Destructor mit dem Schlüsselwort Override versehen und nach dem FPopupBlock.Free noch ein Inherited und es gibt keine Meldungen mehr.
Manchmal sieht man den Wald vor lauter Bäumen nicht.

Gruß & Dank, Alex

P.S. Rein interessehalber: FastMM spricht an anderen Stellen ausdrücklich von TStringList. Warum macht er es hier nicht. Hätte er mir gesagt, dass eine TStringList nicht freigegeben wurde, wäre ich eher und ohne dahinter gekommen.
Alex Winzer
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: TStringList und MemoryLeak (FastMM)

  Alt 5. Jul 2010, 19:57
Zitat:
Abhilfe hat nun geschaffen, dass ich mein TSettings von TObject abgeleitet habe.
Von nichts abgeleitet heisst von TObject abgeleitet
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

AW: TStringList und MemoryLeak (FastMM)

  Alt 5. Jul 2010, 21:02
Der Compiler sieht damit offenbar keine Notwendigkeit den Destructor auszuführen. Wo hat er das nicht gesehn?
(du hast auch irgendwo ein Settings.Free stehn? )

Delphi gibt nichts von alleine frei oder ruft selbstständig Destruktoren auf.
(abgesehn von Interfaces und dynamischen Arrays, bzw. Strings, welche über die Compilermagic behandelt werden)



Und jupp, wird nix angegeben, dann wird implizit von TObjekt abgeleitet.
Bei Interfaces das Selbe, nur da halt von IInterface.
$2B or not $2B

Geändert von himitsu ( 5. Jul 2010 um 21:04 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 17:35 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