407
21.02.2008, 11:22 Uhr
Matthias Hofmann
Administrator Bürstenkaiser
Themenstarter Beiträge: 4133 Dabei seit: 15.04.2003, 23:00 Uhr |
Also gut, was ist ein Memory Tracker? Was genau ist eigentlich Memory, und warum mu� es getrackt werden? Beschäftigen wir uns erst mal mit dem Memory, oder zu Deutsch: Speicher.
Ein Programm besteht zum einen aus Anweisungen, zum anderen aus Daten. Beide befinden sich während der Ausführung des Programms im Speicher, von dem man aber 3 verschiedene Arten unterscheiden kann: Statischen, automatischen und dynamischen.
Der statische Speicher ist der Teil, in dem sich auch die Anweisungen befinden. Er wird dem Programm bei dessen Start vom Betriebssystem zugewiesen und bleibt während dessen Ausführung in seiner Grö�e unverändert. In ihm werden auch die sogenannten globalen Variablen abgelegt, die von allen Teilen des Programms aus verfügbar sind.
Beim automatischen Speicher handelt es sich um den sogenannten Stack, im Deutschen auch Stapel genannt. Auf ihm befinden sich die sogenannten lokalen Variablen, die innerhalb einer Funktion definiert werden und nur dort verfügbar sind. Beim Aufruf einer Funktion "wächst" der Stapel um so viele Bytes, wie für die lokalen Variablen der aufgerufenen Funktion benötigt werden. Beim Verlassen der Funktion "schrumpft" er wieder entsprechend.
Im Gegensatz zu den beiden anderen Arten ist der dynamische Speicher etwas heikel, denn er wird nicht "von selbst" reserviert oder freigegeben, sondern durch den Programmierer. In C++ sieht das zum Beispiel so aus: format_source('// Speicher für ein Objekt // vom Typ int reservieren. int* p = new int;
// Speicher wieder freigeben. delete p;')Wenn es sich nicht um ein Objekt, sondern um ein Array handelt, dann sieht das ganze dagegen zum Beispiel so aus: format_source('// Speicher für ein Array // von 32 Elementen vom // Typ int reservieren. int* p = new int[32];
// Speicher wieder freigeben. // Man beachte die [] nach // dem Schlüsselwort delete. delete [] p;')Eine Reihe weiterer Dinge sind unter anderem dann zu beachten, wenn Vererbung mit ins Spiel kommt.
Jetzt wo wir also wissen, was Memory ist, kommen wir nun zu der Frage: Warum muÃ? es getrackt werden?
Wie Ihr Euch vielleicht denken könnt, kann man bei der Verwendung von dynamischem Speicher allerhand falsch machen. Zu den häufigsten Problemen gehört, da� der Programmierer Speicher reserviert, aber vergi�t ihn wieder freizugeben. Dadurch entsteht ein sogenanntes Speicherleck: Der Speicher ist offiziell belegt, das Programm hat aber dessen Adresse "verloren" und kann daher nicht mehr auf ihn zugreifen. Für den Anwender äu�ern sich Speicherlecks dadurch, da� das Programm während seiner Ausführung immer langsamer wird, während das Betriebssystem verzweifelt Speicher auf der Festplatte hin- und herschaufelt um irgendwo noch was davon aufzutreiben.
Und jetzt kommt zu der Frage: Was ist ein Memory Tracker?
Dabei handelt es sich um einen Mechanismus, der das Reservieren und Freigeben von Speicher während der Ausführung des Programms protokolliert und am Ende eine Logdatei erstellt, in der genau aufgeführt wird, welche Objekte oder Arrays nicht mehr freigegeben wurden. Dabei wird natürlich auch mit angezeigt, wo dieser Speicher im Quelltext (mit Angabe von Dateiname und Zeilennummer) reserviert wurde. Der Programmierer hat so die Möglichkeit, Speicherlecks zu erkennen und sie zu beheben.
Ein guter Memory Tracker entdeckt aber nicht nur Speicherlecks, sondern auch eine Reihe anderer Fehler, die man als Programmierer beim Reservieren und Freigeben von Speicher machen kann.
Noch Fragen? ----- Matthias Hofmann | Klomanager Deluxe jetzt bei Gamesload kaufen Dieser Beitrag wurde am 21.02.2008 um 11:23 Uhr von Matthias Hofmann verändert |