sayso Geschrieben 3. Juni 2006 Teilen Geschrieben 3. Juni 2006 Hallo Kollegen, eine kurze Frage bezüglich des Erzeugens von Instanzen einer Klasse mittels new. Wenn ich eine Instanz mittels new erzeuge, wo wird der Inhalt der Klassenattribute abgelegt (auf Stack oder Heap). Mal ein simples Beispiel: class meine_klasse { int int_variable; }; int main() { meine_klasse *klasse = new meine_klasse; klasse->int_variable = 8; return 0; } Wird die 8 auf dem Heap oder Stack abgelegt? Muss ich den reservierten Speicher mittels new (meine_klasse *klasse = new meine_klasse) mit delete wieder freigeben, oder wird der allokierte Speicher beim Beenden des Programms bzw. beim Beenden der main function automatisch wieder freigegeben? (ergo setzt new auf alloc auf oder nicht?) Danke schonma :e@sy Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
carstenj Geschrieben 3. Juni 2006 Teilen Geschrieben 3. Juni 2006 Hi, alles, was mit new reserviert wird, landet auf dem Heap und muss per delete wieder freigegeben werden. Ja, im Grunde ist das ähnlich malloc, wird auch oft dadurch realisiert. Allerdings ruft new noch den Konstruktor auf, deswegen kann man das auch nicht durch malloc ersetzen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
sayso Geschrieben 4. Juni 2006 Autor Teilen Geschrieben 4. Juni 2006 Hi, alles, was mit new reserviert wird, landet auf dem Heap und muss per delete wieder freigegeben werden. Ja, im Grunde ist das ähnlich malloc, wird auch oft dadurch realisiert. Allerdings ruft new noch den Konstruktor auf, deswegen kann man das auch nicht durch malloc ersetzen. Hallo carsten, erstmal vielen Dank für deine Antwort. D.h. durch einen delete wird auch der Destruktor aufgerufen? Gibt es eigentlich eine Möglichkeit herauszufinden, wo welches Objekt/Attribut abgelegt wurde? Damit meine ich ein Tool oder eine Debug_Info die mir mitteilt, in welchem "Speichertyp" (Heap/Stack) die Variablen, Zeiger, etc.. abgelegt werden. Und noch eine kleine Frage: Gibt es evtl. auch ne Möglichkeit den Memory nach Segmenten zu durchsuchen, die nicht mehr vom beendeten Threads/Prozessen freigegeben wurden. Damit meine ich z.B. eine Tabelle in der ich sehe das der Memorybereich von X-Y zum Thread bzw. Prozess XYZ gehört. So könnte man ja evtl. herausfinden ob noch Speicher allokiert ist, der aber von keinen existierenden Prozess mehr genutzt wird. Danke schonma :byby: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 4. Juni 2006 Teilen Geschrieben 4. Juni 2006 durch einen delete wird auch der Destruktor aufgerufen?Richtig. Damit meine ich ein Tool oder eine Debug_Info die mir mitteilt, in welchem "Speichertyp" (Heap/Stack) die Variablen, Zeiger, etc.. abgelegt werden.Dafür brauchst du kein Tool. Was mit new oder malloc angelegt wird, landet auf dem Heap, Autovariablen auf dem Stack. Gibt es evtl. auch ne Möglichkeit den Memory nach Segmenten zu durchsuchen, die nicht mehr vom beendeten Threads/Prozessen freigegeben wurden. ... So könnte man ja evtl. herausfinden ob noch Speicher allokiert ist, der aber von keinen existierenden Prozess mehr genutzt wird. Darum kümmern sich moderne Betriebssysteme selbst, und sie sorgen auch dafür, dass du dich da nicht einfach so einmischen kannst. Wozu brauchst du das denn? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
sayso Geschrieben 5. Juni 2006 Autor Teilen Geschrieben 5. Juni 2006 Darum kümmern sich moderne Betriebssysteme selbst, und sie sorgen auch dafür, dass du dich da nicht einfach so einmischen kannst. Wozu brauchst du das denn? Hallo Klotzkopp, es geht um folgendes: Ich habe hier Coding von einem Kollegen liegen, der die Firma vor langer Zeit verlassen hat. Leider ist dieses mies dokumentiert und umfangreich. Nun hat ein Kunde ein Problem mit der Software. Wenn das Programm XX Stunden läuft (die Zeit variert stark, je nach dem was er tut) wird immer mehr Speicher verbraucht, bis dazu das es swapped bzw. sogar der virutelle Speicher aufgebraucht wird. Ergo das Programm wird zum Speicherfresser. Nun ist das Coding relativ umfangreich, so das ich mir nen Wolf suchen würde um den Fehler zu finden. Ich gehe mal ganz stark davon aus das der Speicher in irgendeiner Methode / Function bzw in einem Thread nicht mehr freigegeben wird Deswegen habe ich gefragt ob es so ein Tool gibt Unter Unix gibts ja Kerneldebugger mit denen ich mir die Kerneltabellen anzeigen lassen kann, z.B. welche IDs die Filesysteme haben und welche Prozesse auf diesen laufen (inkl. Memory Adresse). Vllt. gibts ja sowas auch nur für Memory... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 5. Juni 2006 Teilen Geschrieben 5. Juni 2006 So ein Tool würde dir aber auch nur helfen, wenn du am Inhalt des Speichers den Ort des Lecks näher eingrenzen könntest. Den Speicher einfach so freizugeben, wird IMHO nicht funktionieren. Du kannst "von außen" nicht erkennen, was noch gebraucht wird, und was nicht. Für so etwas brauchst du einen Garbage Collector, und das ist nicht gerade einfach. Nachträglich bringst du das nicht mehr in ein bestehendes Programm rein. Da würde ich eher als Notlösung das Programm in regelmäßigen Abständen automatisch neu starten. Nach meiner Meinung ist das Finden des Lecks der beste Weg. Unter welchem Betriebssystem bist du denn zu Gange? Falls es Windows ist, könntest du mal diesen LeakFinder ausprobieren. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
sayso Geschrieben 5. Juni 2006 Autor Teilen Geschrieben 5. Juni 2006 So ein Tool würde dir aber auch nur helfen, wenn du am Inhalt des Speichers den Ort des Lecks näher eingrenzen könntest. Den Speicher einfach so freizugeben, wird IMHO nicht funktionieren. Du kannst "von außen" nicht erkennen, was noch gebraucht wird, und was nicht. Für so etwas brauchst du einen Garbage Collector, und das ist nicht gerade einfach. Nachträglich bringst du das nicht mehr in ein bestehendes Programm rein. Da würde ich eher als Notlösung das Programm in regelmäßigen Abständen automatisch neu starten. Hallo, das Programm arbeitet viel mit Threads und durch ein Prozesstracing bekomme ich ja die Thread IDs. So hätte ich den Prozess/Thread zum allokierten Speicherbereich zuordnen können. Freigeben wollte ich den Speicher über das Tool nicht. Wie soll das mit dem neu starten funktionieren? Wenn der Speicher per new bzw. malloc allokiert wurde, wird er doch auch nach Beendigung des Programms nicht freigegeben? Nach meiner Meinung ist das Finden des Lecks der beste Weg. Unter welchem Betriebssystem bist du denn zu Gange? Falls es Windows ist, könntest du mal diesen LeakFinder ausprobieren. Der Client läuft unter Windows 2000/XP und der Serverprozess unter Linux. Es ist eine Client/Server Anwendung. Das Leck tritt aber nur am Client auf Ich werde mir mal das Tool ansehen... vielen Dank :uli :byby: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
baba007 Geschrieben 5. Juni 2006 Teilen Geschrieben 5. Juni 2006 es muss nicht unbedingt ein nicht freigegebener Speicher schuld sein. vielleicht liegt es an der programmierung selbst, so dass objekte zich fach im speicher vorliegen und nicht genutzt werden. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
sayso Geschrieben 5. Juni 2006 Autor Teilen Geschrieben 5. Juni 2006 Hallo, ich bin gerade mal dabei das Tool auszuprobieren.. Noch ne kurze Frage: Wenn Speicher mittels malloc oder new allokiert wurde, wird ja ja funktionsübergreifend bzw. methodenübergreifend allokiert. Erst wenn man free() absetzt wird der zuvor allokierte Speicher in die Freispeicherliste angehängt oder ans OS zurückgegeben, und kann von anderen Programmen genutzt werden. D.h. der Speicher wird erst mit free oder beim Beenden des kompletten Programms freigegeben. Wie verhält sich dies mit Threads? Wenn in Threads mit malloc gearbeitet wird und die free Anweisung nicht vor Beendigung des Threads erfolgt, bleibt der Speicher dann trotzdem noch allokiert solange das "Hauptprogramm" läuft, oder wird der mit Beendigung des Threads wieder ans OS zurückgegeben bzw. an die Freispeicherliste angehängt? Danke führ Eure Hilfe :byby: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 5. Juni 2006 Teilen Geschrieben 5. Juni 2006 Heapspeicher wird nicht automatisch freigegeben, wenn ein Thread endet. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
sayso Geschrieben 5. Juni 2006 Autor Teilen Geschrieben 5. Juni 2006 Heapspeicher wird nicht automatisch freigegeben, wenn ein Thread endet. Hallo Klotzkopp, vielen Dank für die Information. Dann habe ich den Speicherfresser gefunden :beagolisc Mein Kollege hat es so programmiert, das viele Verarbeitungen in Threads laufen, damit man parallel verschiedene Dinge ausführen kann. In diesen Threads werden Instanzen von Klassen mittels new aufgebaut, aber leider nicht mehr per delete gelöscht.... Vielen Dank an Euch :e@sy Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Anybody Geschrieben 6. Juni 2006 Teilen Geschrieben 6. Juni 2006 Und falls du dann doch nicht alles gefunden hast schau dir mal zum Thema "Garbage Collection" an. Und in Threads musst du natürlich höllisch aufpassen was du so alles löscht oder auch nicht. Nur so als kleiner Tipp am Rande Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.