Speicherlücken finden und beheben



  • Hallo,
    ich habe an den Anfang von meinem Programm

    #define CRTDBG_MAP_ALLOC
    #include <crtdbg.h>
    

    und in die OnCancel Methode

    _CrtDumpMemoryLeaks();
    

    eingefügt.

    Wenn ich das Programm im debug modus laufen lasse, steht am ende im Output-Fenster folgendes (nur ein auszug, da stehen viel mehr meldungen)

    Detected memory leaks!
    Dumping objects ->
    {239} normal block at 0x003CB848, 27 bytes long.
     Data: <  .|            > 10 FF 2E 7C 0A 00 00 00 0A 00 00 00 01 00 00 00 
    {225} normal block at 0x003CC9A0, 238 bytes long.
     Data: <  .|            > 10 FF 2E 7C DD 00 00 00 DD 00 00 00 01 00 00 00 
    {224} normal block at 0x003CC870, 239 bytes long.
     Data: <  .|            > 10 FF 2E 7C DE 00 00 00 DE 00 00 00 01 00 00 00 
    {223} normal block at 0x003CC790, 164 bytes long.
     Data: <  .|            > 10 FF 2E 7C 93 00 00 00 93 00 00 00 01 00 00 00 
    {222} normal block at 0x003CC690, 194 bytes long.
     Data: <  .|            > 10 FF 2E 7C B1 00 00 00 B1 00 00 00 01 00 00 00 
    plex.cpp(27) : {221} normal block at 0x003CC5B0, 164 bytes long.
     Data: <        s  Z  < > 00 00 00 00 00 00 00 00 73 9A DD 5A A0 C6 3C 00 
    map_sp.cpp(70) : {220} normal block at 0x003C72B0, 68 bytes long.
     Data: <          <     > 00 00 00 00 00 00 00 00 B4 C5 3C 00 00 00 00 00 
    {217} normal block at 0x003CC3D0, 417 bytes long.
     Data: <  .|            > 10 FF 2E 7C DD 00 00 00 90 01 00 00 01 00 00 00 
    plex.cpp(27) : {216} normal block at 0x003CC2F0, 164 bytes long.
     Data: <  <   <   <   ' > 80 B9 3C 00 04 C3 3C 00 14 BA 3C 00 82 D6 27 C7 
    plex.cpp(27) : {215} normal block at 0x003CBCB8, 164 bytes long.
     Data: <  <   < 4 <    B> A0 B8 3C 00 CC BC 3C 00 34 B9 3C 00 EA 00 BB 42 
    {214} normal block at 0x003CC1D0, 225 bytes long.
     Data: <  .|            > 10 FF 2E 7C 93 00 00 00 D0 00 00 00 01 00 00 00 
    plex.cpp(27) : {213} normal block at 0x003CC0F0, 164 bytes long.
     Data: <h <   <   <     > 68 B7 3C 00 04 C1 3C 00 FC B7 3C 00 A3 E5 C5 1C
    

    Wie kann ich nun daraus erkennen, wo die Speicherlücken entstehen ??

    Für was ist die plex.cpp gut ? Ich binde sie in meinem Code nicht ein.

    P.S. Ich erzeuge keine objekte auf dem heap



  • Siehe MSDN

    Bye, TGGC (Der Held lebt!)



  • Sollte doch ein Object sein das du durch delete() nicht wieder frei gibst.
    Schau dir mal alle "new"-Kontruktoren an, falls du welche hast und sie nicht funktions-lokal sind, musst du diese im Destruktor mit delete() wieder freigeben.
    Greets 🙂



  • Ich hab in meinem Code weder eine free() noch eine delete() anweisung...



  • Sorry war grad am editieren. look up.



  • Es geht ja erstmal darum, ob du irgendwo new oder malloc verwendest.

    Zeichnest du in deiner Anwendung? Oder arbeitest mit Fonts? Die muss man auch zerstören.
    Such mal nach Create-Funktionen und lies nach, ob das erzeugte Objekt sich selber zerstört oder nicht.

    Achja, Google ist echt hilfreich... 🙄
    http://www.dotnet247.com/247reference/msgs/36/183812.aspx

    Sehr hilfreich scheint auch dieser Post zu sein, lass dich nicht von der Sprache abschrecken, ist in Englisch:
    http://www.sources.ru/cpp/mfc/t4668.htm



  • @estartu_de
    cool, der 2. link hat mir geholfen. Ich hatte noch listen mit inhalt gefüllt. die lösche ich jetzt einfach am ende. jetzt sind alle "plex.cpp" fehler weg. Es bleiben aber noch diese hier:

    Detected memory leaks!
    Dumping objects ->
    {191} normal block at 0x003C9780, 27 bytes long.
     Data: <  .|            > 10 FF 2E 7C 0A 00 00 00 0A 00 00 00 01 00 00 00 
    {177} normal block at 0x003C9ED0, 98 bytes long.
     Data: <  .|Q   Q       > 10 FF 2E 7C 51 00 00 00 51 00 00 00 01 00 00 00 
    {176} normal block at 0x003C9E30, 99 bytes long.
     Data: <  .|R   R       > 10 FF 2E 7C 52 00 00 00 52 00 00 00 01 00 00 00 
    {175} normal block at 0x003C9DA0, 80 bytes long.
     Data: <  .|?   ?       > 10 FF 2E 7C 3F 00 00 00 3F 00 00 00 01 00 00 00 
    {174} normal block at 0x003C9D10, 79 bytes long.
     Data: <  .|>   >       > 10 FF 2E 7C 3E 00 00 00 3E 00 00 00 01 00 00 00
    

    Ich zeichne in meiner andwendung.

    Schriften erstelle ich so:

    CFont Schrift;
    Schrift.CreateFont(....);
    

    Stife so:

    CPen axisPen(PS_SOLID, 50, RGB (2,2,2));
    

    Muss ich da am Ende was löschen ?
    Ich habe es bei den Schriften mit DeleteObject() versucht. hat aber nichts gebracht.



  • Siehe MSDN: When you finish with the CFont object created by the CreateFont function, first select the font out of the device context, then delete the CFont object.

    Vielleicht hast du vergessen den font aus dem dc wieder zu löschen.



  • kauf dir den boundschecker von noumega !



  • ich habe es so

    pDC->SelectObject(pOldPen);
    pDC->SelectObject(pOldFont);
    //SchriftH.DeleteObject();
    //SchriftV.DeleteObject();
    

    und so

    pDC->SelectObject(pOldPen);
    pDC->SelectObject(pOldFont);
    SchriftH.DeleteObject();
    SchriftV.DeleteObject();
    

    versucht. Die anzahl der fehlermeldungen bleibt gleich.

    Prinzipiell funktioniert mein programm so:

    In der OnPaint es Dialogfeldes:

    CPaintDC dc(this);
    Zeichnen(&dc);
    

    Die Methode Zeichnen sieht so aus:

    int CGrafik::Zeichnen(CPaintDC* pDC)
    {
    //Hier werden nun Stifte, Schriften auf dem [b]Stack[/b] erstellt.
    //Am Ende werden die stifte wie oben gelöscht
    }
    

Anmelden zum Antworten