Speicherleck finden ...gelöst



  • Hallo,

    könnt ihr mir helfen, ich weiß nicht weiter.

    Der CodeGuard meldet:

    Speicherblock(..) war bereitgestellt mit SysGetMem
    System.pas#3413
    Forms.pas#3260
    Forms.pas#3144
    Forms.pas#9779
    MyProg.cpp#41

    Bisher habe festgestellt, dass dieser Code der Verursacher ist:

    // in Form-Create:
    sl = new TStringlist;     // sl ist in TForm private:
    
    // in Form Close:
    delete sl;
    

    Was soll da falsch sein?
    setze ich das delete aber schon in FormCreate() ein, dann funzt es, aber halt sinnlos.

    Ausserdem mauelt der CodeGuard schon bevor OnClose kommt, und das, obwohl ich alle weiteren Zugriffe auf sl entfernt habe. Noch zur Info, diese Form ist ein Unterformular. Der Fehler wird gemeldet ohne das die Form visible wurde und auch schon wenn ich direkt nach Programmstart das Programm beende ohne irgendetwas getan zu haben.

    Ich hoffe ihr habt einen besseren Start ins neue Jahr. Gruß Rudi

    Entschuldigung: Dadurch, dass ich hier laut gedacht habe, bin ich draufgekommen:
    ich habe vergessen im Hauptformular Close() aufzurufen. 🙄



  • OnClose() ist aber auch nicht der richtige Platz dafür.
    Wenn Du OnCreate verwendest, passt dazu OnDestroy. Ich würde aber empfehlen ausschließlich den Konstruktor / Destruktor zu verwenden.



  • Oder die TStringList in einem smart_ptr verkapseln und mit der Ressourcefreigabe überhaupt nichts mehr am Hut zu haben.



  • DocShoe schrieb:

    Oder die TStringList in einem smart_ptr verkapseln und mit der Ressourcefreigabe überhaupt nichts mehr am Hut zu haben.

    👍



  • audacia schrieb:

    DocShoe schrieb:

    Oder die TStringList in einem smart_ptr verkapseln und mit der Ressourcefreigabe überhaupt nichts mehr am Hut zu haben.

    👍

    Ich weiß ja nicht, ob man mangelnde Erfahrung mit Smart-Pointern ausgleichen sollte. Die kann er später verwenden, aber zuerst sollte er doch verstehen, was er falsch gemacht hat und wie man es richtig macht.



  • Mangelnde Erfahrung hin oder her: ohne Smart-Pointer produziert er speicherleckanfälligen und überdies nicht exceptionsicheren Code, und das ist IMHO in jedem Falle vermeidenswert.



  • Hallo

    Joe_M:

    Ich weiß ja nicht, ob man mangelnde Erfahrung mit Smart-Pointern ausgleichen sollte

    Ich bin jetzt einer ganz anderen Versuchung nahe. Nur, weil ich in einer komplizierten Funktion, mich einfach nicht mehr mit aufräumen beschäftigen will, einen smart_ptr verwenden möchte.
    Gruß Rudi


Anmelden zum Antworten