Speicherlöcher erkennen und reagieren
-
estartu_de schrieb:
Wenn du mit F5 startest, werden die nach dem Beenden des Programms in der Debugausgabe angezeigt.
Doppelklick drauf und du landest da, wo es entsteht.Das wär ja bequem, also hier irgendwo klicken:
Detected memory leaks!
Dumping objects ->
{616} normal block at 0x0481CCD0, 96 bytes long.
Data: < > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
{549} normal block at 0x0481A778, 288 bytes long.
Data: < # > 08 95 03 10 23 00 0C 80 00 CD CD CD CD CD CD CD..
{112} normal block at 0x04815E68, 48 bytes long.
Data: <Argument ist au > 41 72 67 75 6D 65 6E 74 20 69 73 74 20 61 75 DF
{111} normal block at 0x04815E08, 32 bytes long.
Data: <Ung ltige Enumer> 55 6E 67 FC 6C 74 69 67 65 20 45 6E 75 6D 65 72
Object dump complete.Bei mit tut sich leider nix. Was muss ich jetzt tun?
danke,
don_basto.
-
Verwende meinen Leakfinder...
Du kannst auch meinen ganz neuen verwenden:
http://blog.kalmbachnet.de/files/LeakFinder-RC3.zip
-
Alles schön und gut mit LeakFinder nur setzt man diese Anwendung ein????
-
Wie "Anwendung"... und "Einsetzen"?
Ich hoffe doch dass niemand ein Produkt mit dem Leakfinder ausliefert! sondern nur zum Speicherleck suchen verwendet...
-
don_basto schrieb:
Bei mit tut sich leider nix. Was muss ich jetzt tun?
danke,
don_basto.Das hier muss im Cpp sein, wo das Memoryleak erzeugt wird:
#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif
-
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 lochstrcore.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?