Global den Speicher wieder freiräumen?
-
Hallo zusammen,
gibts ne Möglichkeit, den gesamten Speicher, den eine laufende Anwendung braucht, neu zu ordnen und eventuell nicht mehr benötigten Speicher wieder freizugeben ?
Hintergrund ist, daß meine Anwendung zwar läuft, aber immer wieder mal zwischen 4 und 16 Bytes an Speicher "verschluckt", obwohl ich alle selbsterstellten Klassen etc. wieder freigebe.
Gruß
Udo
-
4-16 Byte... oh, je oh, je... Bei 256MB Hauptspeicher, sagen mir ma 200 frei, sagen wir ma es sind 16 Byte, da müsste das verschlucken ja nur 13107200 mal Auftreten und schwups, der Speicher wäre voll... Wenn das verschlucken einmal in der sekunde Auftritt dann wäre nach 3641 Stunden schluss, das sind ja nur 151 Tage !!!!!!!!!
-
Toll,
rechnen kannst Du also. Wie siehts dann mit programmieren aus? Ein Vorschlag wäre schon ausreichend.
Danke
-
Wie stellst du denn fest das dein Programm den Speicher unterschlägt ?
-
Taskmanager auf und dann mal schauen, was das Programm mit dem Speicher so treibt. Gibts hier jetzt was oder nicht. Außerdem habe ich mich verschrieben, sorry, war mein Fehler. Sollte eigentlich heissen zwischen 4 und 16 KB.
Und das merkt man auf Dauer schon oder nicht?
-
Na dann wird vermutlich irgendwo noch ein Leck sein...
-
Eben deshalb meine Frage.
-
Na wie soll man dazu ohne code was sagen... Du musst halt die Fehlerhafte stelle finden, wie soll generell "nicht mehr benötigten Speicher wieder freigegeben" werden können, das Programm kann nicht automatisch wissen was du noch brauchst und was nicht.
-
Habe ich mir schon gedacht. Nur mal nochmal zum Verständniss. Wenn ich Klassen und Variablen nur lokal in einer Funktion deklariere, werden sie doch beim Verlassen der Funktion wieder freigegeben oder? Oder muß ich die explizit wieder aus dem Speicher entfernen?
-
Die musst du wieder entfernen... Die Variablen zumindest dann wenn du Sie dynamisch erzeugst.
-
Was meinst Du mit "dynamisch"?
-
Es gilt: Für jedes New, das ausgeführt wird, muss ein delete irgendwo ausgeführt werden. Prüf das nach.
-junix
-
Habe ich gemacht. Trotzdem mage er nicht so, wie ich mir das vorstelle. Die einzigen new-Befehle, die ich nicht zurücksetze ist ne Klasse, die ich während des Programmablaufes offen halte. Die wird immer wieder neu initialisiert und selbst in der Initialisierungsfunktion habe ich darauf geachtet daß die lokalen new-Befehle der Klasse zurückgesetzt werden.
-
Hast du schon mal ein Tool wie CodeGuard oder MemProof auf deinen Code angesetzt?
-
Nein, noch nicht. Bisher habe ich nur versucht, es mit der normalen Oberfläche des BCB zu lösen. Ich werde mir die Programme mal anschauen. Der CodeGuard ist bei BCB schon dabei, soweit ich gesehen habe. Wie kann ich denn den starten?
-
Die einzigen new-Befehle, die ich nicht zurücksetze ist ne Klasse...
Was meinst du mit "nicht zurücksetzen"? Wenn du damit meinst, dass es zu dem new kein passendes delete gibt, dann hole das schleunigst nach. Oftmals ist auch ein dynamisch erzeugter Array die Fehlerquelle. Bei solchen Arrays benutzt man nicht delete, sondern delete[].
-
Nein, um Gottes Willen. Natürlich wird die Klasse beim Verlassen der Anwendung wieder freigegeben. Sie dient lediglich dazu, mir ein paar benötigte Informationen für das Programm bereitzuhalten und ermöglicht mir nen schnelleren Zugriff auf benötigte Informationen. Diese Informationen werden von Zeit zu Zeit durch das Programm aufgefrischt, quasi eine Art Refresh dieser Klasse.
Da die Klasse aber selbst Strukturen und Unterklassen benutzt, habe ich durch ne Löschroutine innerhalb der Klasse sichergestellt, daß alle benutzten Unterklassen bei einem Refresh freigegeben und danach eben wieder neu mit den Informationen bestückt werden.
Gruß Udo