_CrtMemState Frage
-
Jetzt bin ich doch (s.u) etwas tiefer ins Debugging eingestiegen - und habe gesehen, dass man über den _CrtMemBlockHeader einige nützliche Informationen herausfiltern kann.
http://weseetips.com/2008/04/page/2/
Theoretisch sollte man auf diese Information zurückgreifen können, indem man Memory-Zustände vergleicht.
Das geht auch wunderbar, etwa so:
_CrtMemState memstate1, memstate2, memstate3 ; // empfangen die MemStates _CrtMemCheckpoint(&memstate1) ; // macht einen Schnappschuss // hier taucht ein Speicherleck auf _CrtMemCheckpoint(&memstate2) ; // macht einen Schnappschuss // Jezrt werden die Zustände verglichen: if(_CrtMemDifference(&memstate3, &memstate1, &memstate2)) { // wenn das wahr ist, gibt es Speicherlecks }Nach dem obigen Code müsste memstate3 jetzt die Informationen enthalten, und da der CrtMemBlockHeader ein Teil der Struktur ist, sollte man darauf zugreifen können - und sich den Namen der Datei, die Zeile, in der die Variable deklariert wurde, ausgeben lassen können.
Dummerweise funktioniert genau das nicht.
Hat jemand eine Idee?
-
Und we allokierst Du das Speicherleck. Bei Verwednung von new müsstest Du DEBUG_NEW (IMHO MFC) definieren bzw _malloc_dbg verwenden.
Das macht man üblicherweise über entsprechende defines...http://msdn.microsoft.com/en-us/library/aa298452(VS.60).aspx
-
schönen Dank, aber wie ich gesehen habe, ist
#define new DEBUG_NEW
eine MFC -Direktive (und gibt mir jede Menge Compilerfehler zurück)
wie macht man das in einem Konsolenprogramm?Ich hab's mit _msize_dbg probiert
http://msdn.microsoft.com/en-us/library/swddftz0.aspx
aber auch da habe ich nur einen Speicherblock, der mir keinen keinen Zugriff auf die Informationen ermöglicht,
Vielleicht sollte ich dich noch allgemeiner fragen (und auf diese Weise meine beisherige Unkenntnis auf diesem Feld unterstreichen): Wo finde ich ein Beispielprogram, das mir zeigt, wie ich die einzelnen MemBlock auf dem Heap durchgehen - und die entsprechenden Informationen extrahieren kann (etwa: in welcher Datei wird die Variable deklariert, an welcher Stelle)?
-
Schau in die MSDN!
Über die entsprechenden API Funktionen findest Du auch die Links.Grundsätzlich: Die Informationen über Dateinamenund Zeile werdenur eingesetzt wenn auch entsprechende Funktionen benutzt werden, die das unterstützen!
Bzgl. DEBUG_NEW: Aschi doch einfach in die MSDN wie es dort gemacht wird. Das ist absolut simpel. Du hast doch den Sourcecode!
http://msdn.microsoft.com/en-us/library/1666sb98.aspx
http://msdn.microsoft.com/en-us/library/5x0xdt8e.aspx