Speicherlöcher erkennen und reagieren



  • Wozu wird denn sonst das THIS_FILE benutzt?
    Sprich, warum ist das nicht standardmäßig integriert?



  • Das ganze hilft Dir aber nichts wenn Du STL oder MFC/ATL verwendest... da dann immer die Leaks tief in der STL/MFC/ATL sind 🙂



  • Funzt net. 😞
    Mein VS7.1 macht da nicht mit. Gibt's sonst noch was zu beachten?
    Compileroption /D "_DEBUG" ist gesetzt.

    <edit>
    @Jochen:
    Ich benutze MFC und STL. Werd mir mal dein Programm anschauen. 🙂
    </edit>



  • Also bei mir geht es mit MV 6.0 bekomme im Debug Fenster die Leaks angezeigt.
    Aber was ich jetzt verstehe ist.
    1.
    Das ist ein solches Speicher loch

    strcore.cpp(118) : {153} normal block at 0x00C37268, 16 bytes long.
     Data: <            3   > 01 00 00 00 01 00 00 00 01 00 00 00 33 00 00 00
    

    Nur leider kann ich da nicht drauf klicken da ich diese datei nicht öffnen kann in meinem Projekt.

    Ein weiteres ensteht an folgender stelle im Quelltext
    m_pTeileNummernListe = new CList<STn,STn>;

    Aber warum ist das nen Speicherloch



  • Tinchen schrieb:

    Ein weiteres ensteht an folgender stelle im Quelltext
    m_pTeileNummernListe = new CList<STn,STn>;

    Aber warum ist das nen Speicherloch

    Wo gibst du die CList denn wieder frei? Oder besser: wo soll sie freigegeben werden? Weil machen tust du es nicht, sonst wers kein MemLeak 🙂



  • Naja das ganze schaut so aus

    in meiene header datei *.h vereinbare ich die Variable

    CList  <SP,SP> * m_pPrueflingListe;
    

    in der *.cpp im OnInitDialog

    m_pTeileNummernListe = new CList<STn,STn>;
    m_pTeileNummernListe = aTN.GetTnListe();
    

    und dann bleibt die Liste da ganze Programm bestehen da ich sie immer wieder brauche.



  • Wieso holst du dir erst mit new eine Liste, wenn du unmittelbar dahinter den Zeiger auf eine andere Adresse verbiegst? (durch die Anweisung "m_pTeileNummernListe = aTN.GetTnListe();" vergisst du die Adresse des mit new angelegten Blocks - da ist es klar, daß ein Speicherleck auftritt)



  • jo und wenn du nirgendwo ein delete machst, wird das natürlich als MemLeak erkannt



  • Ups jetzt hab ich was durcheineander gebracht

    in der *.h

    CList  <SP,SP> * m_pPrueflingListe;
    

    in der *.cpp im OnInitDialog

    m_pPrueflingListe = new CList<SP,SP>; 
    m_pPrueflingListe = aTN.GetTnListe();
    

    So sieht es eigentlich aus.



  • mach das new mal in deinen Konstruktor und das delete der Liste in deinen Destruktor



  • Tinchen schrieb:

    m_pPrueflingListe = new CList<SP,SP>; 
    m_pPrueflingListe = aTN.GetTnListe();
    

    So sieht es eigentlich aus.

    Und so ist es falsch.

    Einfaches Beispiel:

    int a;
    a = 5;
    a = 0;
    

    Wo ist die 5? Sie ist weg. Da kommst du nie wieder ran, weil du sie mit der 0 überschrieben hast.

    Das gleiche passiert bei deinem Code. Den Zeiger, den du durch den Aufruf von new bekommst, überschreibst du gleich danach wieder. Der Speicher, auf den dieser Zeiger gezeigt hat, ist verloren, den kannst du gar nicht mehr freigeben.



  • 😮 mist stümmt ganz übersehen^^
    Was isn das aTN für ein Typ Tinchen?


Anmelden zum Antworten