Zum Inhalt springen

C++: Speicherallokierung bei new


sayso

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?
Link zu diesem Kommentar
Auf anderen Seiten teilen

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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...