ChrisChiu
24-05-2004, 04:52
Falls ihr es noch nicht wisst, Visual C++ hat eine nette C/C++ Library, die einen Debug-Heap hat, der Memory Leaks tracken kann.
Es erfordert allerdings ein wenig Arbeit, das zu enablen (gibt aber Artikel dafür), dafür hab ich folgende Header-Datei geschrieben:
http://www.metalhazard.com/files/debug.h
Usage:
In jede .cpp-Datei #includen, die getrackt werden soll. Allerdings Achtung, am besten als _letztes_ #include, nach allen anderen #includes. Die Redefinition des "new" Operators verträgt sich anscheinend nicht mit Template-Definitionen, daher erst nach allen template < ... > Sachen includen.
Weiters muß bei Programmstart einmal "InitDebug();" aufgerufen werden.
Wenn ihr jetzt das Programm im Debug-Modus unter Visual C++ startet, und ein Memory-Leak der Form:
char* leak = new char[1024];
auftritt (also ein new ohne korrespondierendes delete), gibt es im Debug-Output-Window von Visual C++ folgendes aus (es schreibt es auch in die debug.log):
Detected memory leaks!
Dumping objects ->
main.cpp(26) : {47} client block at 0x04893A08, subtype 0, 1024 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
Ein Doppelklick auf die Zeile mit der Dateiangabe bringt einen direkt zu der Zeile mit dem new.
Die Debug-Heap-Library soll auch gegen Out-of-Bounds-Pointer-Accesses helfen.
Ach ja, ich hab die debug.h jetzt mal auf Overloading von new ausgelegt, für malloc müsste man ähnliches tun (ich verwend nur mehr new).
Mehr Informationen zum MS Debug Heap gibt's hier:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/HTML/_core_using_the_debug_heap.asp
Es gibt ähnliche Dinge auch für andere Compiler, bzw. kann man sich einen Memory-Leak tracker auch selbst schreiben.
Jedenfalls sehr empfehlenswert, Memory Leaks können eine nervige Quelle für Fehler sein (da der Fehler oft dort auftreten kann, wo eigentlich nicht der Fehler liegt).
Es erfordert allerdings ein wenig Arbeit, das zu enablen (gibt aber Artikel dafür), dafür hab ich folgende Header-Datei geschrieben:
http://www.metalhazard.com/files/debug.h
Usage:
In jede .cpp-Datei #includen, die getrackt werden soll. Allerdings Achtung, am besten als _letztes_ #include, nach allen anderen #includes. Die Redefinition des "new" Operators verträgt sich anscheinend nicht mit Template-Definitionen, daher erst nach allen template < ... > Sachen includen.
Weiters muß bei Programmstart einmal "InitDebug();" aufgerufen werden.
Wenn ihr jetzt das Programm im Debug-Modus unter Visual C++ startet, und ein Memory-Leak der Form:
char* leak = new char[1024];
auftritt (also ein new ohne korrespondierendes delete), gibt es im Debug-Output-Window von Visual C++ folgendes aus (es schreibt es auch in die debug.log):
Detected memory leaks!
Dumping objects ->
main.cpp(26) : {47} client block at 0x04893A08, subtype 0, 1024 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
Ein Doppelklick auf die Zeile mit der Dateiangabe bringt einen direkt zu der Zeile mit dem new.
Die Debug-Heap-Library soll auch gegen Out-of-Bounds-Pointer-Accesses helfen.
Ach ja, ich hab die debug.h jetzt mal auf Overloading von new ausgelegt, für malloc müsste man ähnliches tun (ich verwend nur mehr new).
Mehr Informationen zum MS Debug Heap gibt's hier:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/HTML/_core_using_the_debug_heap.asp
Es gibt ähnliche Dinge auch für andere Compiler, bzw. kann man sich einen Memory-Leak tracker auch selbst schreiben.
Jedenfalls sehr empfehlenswert, Memory Leaks können eine nervige Quelle für Fehler sein (da der Fehler oft dort auftreten kann, wo eigentlich nicht der Fehler liegt).