![]() |
Anfängerfrage zu FastMM 4Speicherlecks in einer Zeile
Hallo nochmal an alle DP´ler,
noch eine Frage in Ergänzung zu den Posts heute morgen. Versuche gerade die Speicherlecks in meinem Programm mit der Empfehlung zur Verwendung von FastMM zu beseitigen. Jetzt stoße ich hierbei allerdings auf gewisse Widrigkeiten, wo ich mal gern wüsste, wie ich damit umgehen soll. Ich verwende folgende 2 Funktionen, die ich auch hier in der DP gefunden habe:
Delphi-Quellcode:
Gerade bei der DriveExists-Funktion stehe ich jetzt vor einer meiner Meinung nach Zwiespältigen Frage, enthält diese Zeile wirklich 4 Speicherlecks? Sind das eventuell Folgefehler? Wenn ich die Funktionalität der Funktion haben möchte/ brauche, muss ich dann die Speicherlecks akzeptieren?
function TFestplattenArbeit.DriveExists(DriveByte: Byte): Boolean;
begin Result := GetLogicalDrives and (1 shl DriveByte) <> 0; // Diese Zeile auskommentiert verringert die Anzahl der Speicherlecks um 4 Einträge. end; procedure TFestplattenArbeit.simpleDriveSearch(var LaufwerkList: TStringList); var Index: Integer; begin Index := 0; // Die ursprüngliche "For Index := 0 to 25 do"-Schleife wurde abgeändert, da hier auch mehrer Speicherlecks "anscheinend" drin waren. while DriveExists(Index) do begin LaufwerkList.Add(Chr(Index + Ord('A')) + ':\'); Inc(Index); end; end; Ich hoffe jemand kann mir dort etwas Klarheit verschaffen. Ansonsten war der Tip mit FastMM sehr gut, habe somit meine Speicherlecks von anfänglich 105 auf 58 reduzieren können. Dachte mir schon, dass es einige sein würden, aber sicherlich nicht so viele. Eine Abschließende Frage ist eigentlich sollte man ein Programm möglichst immer mit 0 Speicherlecks erzeugen oder ist eine "verhältnismäßige" Anzahl an Speicherlecks/Zeilenanzahl akzeptabel? Ps.: im Quellcodebeispiel steht einmal ein anscheinend in Anführungsstrichen, dies ist der Fall, da ich keine qualitativ oder quantitative Erkenntnis daraus gewinnen kann, da keine Erfahrung im Umgang mit Speicherlecks bei mir vorhanden ist. Vielen Dank BAMatze |
Re: Anfängerfrage zu FastMM 4Speicherlecks in einer Zeile
Hey,
nunja so auf den ersten Blick würde ich einfach mal sagen das du bei der Schleife Werte in eine Liste packst sie aber nicht wieder freigibst (bei der For-Schleife hat er wahrscheinlich einfach mehrere Items in die Liste eingefügt als bei der While-Schleife) und beim oberen wüßte ich gern was GetLogicalDrives macht...kann es vll sein das dort die Memoryleaks entstehen? PS: Also bei mir in der Firma ist es sozusagen Pflicht keine MemoryLeaks zu haben...es ist ja auch kein allzu großer Aufwand den Speicher freizugeben :wink: MfG Alaitoc |
Re: Anfängerfrage zu FastMM 4Speicherlecks in einer Zeile
Es gibt eigentlich keine aktzeptable Anzahl von Speicherlecks (schon garnicht Speicherlecks/Zeilenanzahl).
Speicherlecks deren Ursache in fremden Komponenten liegt (oder Delphi-intern), lassen sich manchmal nicht verhindern. Solange die Größe der Lecks wärend der Programmausführung nicht ständig wächst, kann man damit leben. In deinem Fall dürfte die Ursache aber nicht die Funktion GetLogicalDrives sein. Vermutlich gibst du einfach die Variable LaufwerkList irgendwo nicht frei. Für jeden Laufwerksbuchstaben wird ein eigener String mit eigenem Speicher erzeugt. Deine While-Schleife bricht wahrscheinlich bereits bei "B:\" ab. Die For-Schleife prüft alle Buchstaben, entsprechend mehr Einträge hat die Liste. Mist zu langsam :mrgreen: |
Re: Anfängerfrage zu FastMM 4Speicherlecks in einer Zeile
Wenn Du die Zeile in DriveExists auskommentierst, ist das Result undefiniert. Anscheinend kommt da false bei heraus, so dass die Schleife in simpleDriveSearch nicht durchlaufen wird. Das bedeutet, dass DriveExists nicht die Ursache ist.
|
Re: Anfängerfrage zu FastMM 4Speicherlecks in einer Zeile
Danke schonmal für die Anregungen :), allerdings die Liste wird freigegeben, der Fehler ist schon einer der 47 anderen Lecks, die ich behoben hab. Werde mir das ganze wohl übers Wochenende nochmal genauer anschauen müssen.
Wie gesagt, ist gerade jetzt am Anfang schonmal schwer, für die oben genannten Fragen eine Antwort zu finden. Werde hier dann natürlich auch versuchen die Lecks zu stopfen :-D . Schönes Wochenende BAMatze |
Re: Anfängerfrage zu FastMM 4Speicherlecks in einer Zeile
Hallo nochmal an alle,
Hab mal noch eine Frage zur Speicherleck-Suche mit FastMM. Hoffe ich verstoße damit nicht gegen die DP-Regeln, da sie eigentlich direkt mit den vorherigen Fragen zusammen hängt, wenn doch mache ich dafür auf Hinweis natürlich noch einen Extrathreat auf. Also ich habe mir jetzt eigentlich gedacht, da ich ca 10 Units und 4-5 eigene Komponenten für mein Projekt habe und auch in anderen Threats schon gelesen hab, dass das suchen einiger Memorylecks nur mit "Try and Error" zu finden sind (vor allem habe ich AnsiStringErrors welche ja schwer zu lokalisieren sind). Ich wollte jetzt eigentlich um die Fehlerzahl und Suche zu vereinfachen ein kompeltt neues Projekt auf machen, wo ich jeweils nur 1 Teil meines Hauptprogrammes testen will (also eine Unit oder eine Komponente) und dort auch mit FastMM die Speicherlecks anzeigen lassen. Allerdings stellt sich mir dann jetzt die Frage, ob ich meine Komponenten wirklich so auf Fehler untersuchen kann. Also die direkte Frage ist, wenn ich eine eigene Komponente (ist direkt in Delphi eingebunden/ installiert) in einem leeren Projekt mit FastMM starte, zeig mir FastMM dann Fehler in der Komponente an? Vielen Dank BAMatze |
Re: Anfängerfrage zu FastMM 4Speicherlecks in einer Zeile
Zitat:
|
Re: Anfängerfrage zu FastMM 4Speicherlecks in einer Zeile
Zitat:
|
Re: Anfängerfrage zu FastMM 4Speicherlecks in einer Zeile
Zitat:
Zitat:
Beispiel: Wenn das Speicherleck in einem Setter für eine neue Eigenschaft ist, dann muss die Eigenschaft beim Test auch benutzt werden, damit der Fehler auftritt. |
Re: Anfängerfrage zu FastMM 4Speicherlecks in einer Zeile
Ah ok dann habe ich das jetzt also verstanden, glaube ich. Werde ich also versuchen umzusetzen.
Zitat:
BAMatze |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:24 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