Ressourcenleck finden



  • Hallo,

    Codeguard liefert die Meldung:

    Ressourcenleck in Prozess:
    Prog.exe(1600) Systen.pas #3413

    ich verwende Builder 2009

    Was kann ich nun mit dieser Meldung anfangen? Wo und wie finde ich den schuldigen Quellcode in meinen Programm?

    Gruß Rudi



  • Normalerweise liefert Codeguard doch auch die Stelle, wo der Speicher allokiert wird. In deinem Fall nicht?

    Bei mir steht dann da "The memory block ( size: xy ) was allocated with malloc"
    und darunter die Stelle im Quelltext.

    Anmerkung: Ich verwende den BCB6



  • Hallo,

    Wenn da nichts weiter bekannt ist hilft es normalerweise schrittweise Codeteile auszukommentieren bis der Fehler weg ist.



  • Ja, damit habe ich jetzt angefangen. Denn dort, wo Codeguard gemauelt hat, war nichts zu finden und da lief es auch schon jahrelang.

    Jetzt bin ich aber auf etwas gestoßen, das ich mir nicht erklären kann. Wenn zum erstenmal, nach Programmstart eine TCheckBox gesetzt werden soll, dann kommt ein Meldungsfenster :"Ungültige Gleitkommaoperation". Damit wird die Funktion abgebrochen. Nach wegklicken der Meldung und nochmaligen Aufruf der Funktion wird die Box klaglos gesetzt und alles geht anscheinend seinen Gang.

    Was kann man da falsch machen?

    Gruß Rudi



  • Das kann man ohne Code schlecht sagen.
    Für mich hört sich das nach UB an. Evtl. hast du vorher schon irgendwas gemacht was dieses undefinierte Verhalten hervorruft (meist Zugriff auf ungültigen Speicher). Auch hier hilft meist nur auskommentieren bis der Fehler nicht mehr auftritt.



  • Was meine Suche nach dem Fehler behindert hat, war dieses nichtssagende Meldungsfenster "Div/0".
    Diese Meldung kam immer beim ersten mal nach Programmstart, wenn eine Checkbox gesetzt werden sollte.
    Um den Fehler zu finden hab ich dann diese Set-anweisung in einen Try{} Block eingebaut.
    Dadurch kam nicht mehr das vorherige Meldungsfenster, sondern eine Systemexception-Meldung.
    Mit anklicken von "Anhalten" führte diese mich zu der Anweisung, die Div/0 machte.
    Damit war der Fehler erkannt.
    Das Setzten der Checkbox löste deren Ereignis "OnClick" aus. Dort sollte gezeichnet werden, aber das Fenster war noch nicht fertig initalisiert.
    Ich verschob das Setzen der Checkbox zeitlich nach hinten, und nun läuft es.

    Das Ding hat mich 3 Tage gekostet.
    Ich hoffe Ihr könnt einen Nutzen daraus ziehen.

    Gruß Rudi



  • Ich hoffe, du kannst einen Nutzen daraus ziehen 😃



  • Hallo It0101:
    Du verschwendest hier nur Speicherplatz, ohne jeglichen Zugewinn.



  • wenn man es genau nimmt, ist die TCheckbox falsch programmiert.
    Denn wörtlich genommen bedeutet "OnClick" ein Ereignis, wenn ich auf die Box mit der Maus CLICKE (oder mit Tab & Return).
    Es ist dann doch nicht nötig dieses Ereignis auszulösen, wenn die Checkbox per Software geändert wird. Würde ich das wollen, könnte ich die Ereignisroutine anschließend selbst aufrufen.



  • Das OnClick-Verhalten ist bei allen entsprechenden VCL-Komponenten so realisiert.
    Macht doch auch Sinn, so hast du immer dasselbe Ergebnis, egal, ob der Click vom Anwender oder programmatisch ausgelöst wurde. Im Normalfall musst du also keine Behandlungsroutinen "von Hand" aufrufen.
    Und in den Fällen, wo sich durch den programmatischen Aufruf Probleme ergeben könnten, bist du als Programmierer doch über die besondere Situation informiert.



  • Nö, da hat rudiM schon recht. Das OnClick sollte nur dann ausgelöst werden, wenn die Checkbox tatsächlich geklickt wird. Hat mich auch schon einige Male geärgert, dass durch das Setzen des Status plötzlich Nebeneffekte ausgelöst werden. Schlauer wäre es gewesen, man hätte der Checkbox zusätzlich ein OnChange spendiert.


Anmelden zum Antworten